@@ -3314,6 +3314,20 @@ is_protected() {
33143314 return JNI_FALSE ;
33153315}
33163316
3317+ jint initializeJnaStatics (JNIEnv * env ) {
3318+ int result = JNI_VERSION_1_4 ;
3319+ const char * err ;
3320+ if ((err = JNA_init (env )) != NULL ) {
3321+ fprintf (stderr , "JNA: Problems loading core IDs: %s\n" , err );
3322+ result = 0 ;
3323+ }
3324+ else if ((err = JNA_callback_init (env )) != NULL ) {
3325+ fprintf (stderr , "JNA: Problems loading callback IDs: %s\n" , err );
3326+ result = 0 ;
3327+ }
3328+ return result ;
3329+ }
3330+
33173331JNIEXPORT jboolean JNICALL
33183332Java_com_sun_jna_Native_isProtected (JNIEnv * UNUSED (env ), jclass UNUSED (classp )) {
33193333 return is_protected ();
@@ -3335,6 +3349,10 @@ Java_com_sun_jna_Native_getNativeVersion(JNIEnv *env, jclass UNUSED(classp)) {
33353349#ifndef JNA_JNI_VERSION
33363350#define JNA_JNI_VERSION "undefined"
33373351#endif
3352+ // sanity check initialization
3353+ if (classString == NULL ) {
3354+ initializeJnaStatics (env );
3355+ }
33383356 return newJavaString (env , JNA_JNI_VERSION , CHARSET_UTF8 );
33393357}
33403358
@@ -3346,39 +3364,50 @@ Java_com_sun_jna_Native_getAPIChecksum(JNIEnv *env, jclass UNUSED(classp)) {
33463364 return newJavaString (env , CHECKSUM , CHARSET_UTF8 );
33473365}
33483366
3349- JNIEXPORT jint JNICALL
3350- JNI_OnLoad (JavaVM * jvm , void * UNUSED (reserved )) {
3367+ JNIEXPORT jboolean JNICALL Java_com_sun_jna_Native_isStaticEnabled (JNIEnv * UNUSED (env ), jclass UNUSED (classp )) {
3368+ #ifdef JNA_STATIC
3369+ return JNI_TRUE ;
3370+ #else
3371+ return JNI_FALSE ;
3372+ #endif
3373+ }
3374+
3375+ JNIEXPORT jint JNICALL Java_com_sun_jna_Native_initializeStatic (JNIEnv * env , jclass UNUSED (classp )) {
3376+ return initializeJnaStatics (env );
3377+ }
3378+
3379+ jint setupJna (JavaVM * jvm ) {
33513380 JNIEnv * env ;
3352- int result = JNI_VERSION_1_4 ;
33533381 int attached = (* jvm )-> GetEnv (jvm , (void * )& env , JNI_VERSION_1_4 ) == JNI_OK ;
3354- const char * err ;
3355-
33563382 if (!attached ) {
33573383 if ((* jvm )-> AttachCurrentThread (jvm , (void * )& env , NULL ) != JNI_OK ) {
33583384 fprintf (stderr , "JNA: Can't attach native thread to VM on load\n" );
33593385 return 0 ;
33603386 }
33613387 }
3362-
3363- if ((err = JNA_init (env )) != NULL ) {
3364- fprintf (stderr , "JNA: Problems loading core IDs: %s\n" , err );
3365- result = 0 ;
3366- }
3367- else if ((err = JNA_callback_init (env )) != NULL ) {
3368- fprintf (stderr , "JNA: Problems loading callback IDs: %s\n" , err );
3369- result = 0 ;
3370- }
3388+ int result = initializeJnaStatics (env );
33713389 if (!attached ) {
33723390 if ((* jvm )-> DetachCurrentThread (jvm ) != 0 ) {
33733391 fprintf (stderr , "JNA: could not detach thread on initial load\n" );
33743392 }
33753393 }
3376-
33773394 return result ;
33783395}
33793396
3380- JNIEXPORT void JNICALL
3381- JNI_OnUnload (JavaVM * vm , void * UNUSED (reserved )) {
3397+ #ifdef JNA_STATIC
3398+ JNIEXPORT jint JNICALL
3399+ JNI_OnLoad_jnidispatch (JavaVM * jvm , void * UNUSED (reserved )) {
3400+ setupJna (jvm );
3401+ return JNI_VERSION_1_8 ; // upgrade to JNI_VERSION_1_8; required for static JNI
3402+ }
3403+ #else
3404+ JNIEXPORT jint JNICALL
3405+ JNI_OnLoad (JavaVM * jvm , void * UNUSED (reserved )) {
3406+ return setupJna (jvm );
3407+ }
3408+ #endif
3409+
3410+ void unloadJna (JavaVM * vm ) {
33823411 jobject * refs [] = {
33833412 & classObject , & classClass , & classMethod ,
33843413 & classString ,
@@ -3443,6 +3472,16 @@ JNI_OnUnload(JavaVM *vm, void *UNUSED(reserved)) {
34433472 }
34443473}
34453474
3475+ #ifdef JNA_STATIC
3476+ JNIEXPORT void JNICALL JNI_OnUnload_jnidispatch (JavaVM * jvm , void * UNUSED (reserved )) {
3477+ unloadJna (jvm );
3478+ }
3479+ #else
3480+ JNIEXPORT void JNICALL JNI_OnUnload (JavaVM * jvm , void * UNUSED (reserved )) {
3481+ unloadJna (jvm );
3482+ }
3483+ #endif
3484+
34463485JNIEXPORT void JNICALL
34473486Java_com_sun_jna_Native_unregister (JNIEnv * env , jclass UNUSED (ncls ), jclass cls , jlongArray handles ) {
34483487 jlong * data = (* env )-> GetLongArrayElements (env , handles , NULL );
0 commit comments