@@ -3314,6 +3314,20 @@ is_protected() {
3314
3314
return JNI_FALSE ;
3315
3315
}
3316
3316
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
+
3317
3331
JNIEXPORT jboolean JNICALL
3318
3332
Java_com_sun_jna_Native_isProtected (JNIEnv * UNUSED (env ), jclass UNUSED (classp )) {
3319
3333
return is_protected ();
@@ -3335,6 +3349,10 @@ Java_com_sun_jna_Native_getNativeVersion(JNIEnv *env, jclass UNUSED(classp)) {
3335
3349
#ifndef JNA_JNI_VERSION
3336
3350
#define JNA_JNI_VERSION "undefined"
3337
3351
#endif
3352
+ // sanity check initialization
3353
+ if (classString == NULL ) {
3354
+ initializeJnaStatics (env );
3355
+ }
3338
3356
return newJavaString (env , JNA_JNI_VERSION , CHARSET_UTF8 );
3339
3357
}
3340
3358
@@ -3346,39 +3364,50 @@ Java_com_sun_jna_Native_getAPIChecksum(JNIEnv *env, jclass UNUSED(classp)) {
3346
3364
return newJavaString (env , CHECKSUM , CHARSET_UTF8 );
3347
3365
}
3348
3366
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 ) {
3351
3380
JNIEnv * env ;
3352
- int result = JNI_VERSION_1_4 ;
3353
3381
int attached = (* jvm )-> GetEnv (jvm , (void * )& env , JNI_VERSION_1_4 ) == JNI_OK ;
3354
- const char * err ;
3355
-
3356
3382
if (!attached ) {
3357
3383
if ((* jvm )-> AttachCurrentThread (jvm , (void * )& env , NULL ) != JNI_OK ) {
3358
3384
fprintf (stderr , "JNA: Can't attach native thread to VM on load\n" );
3359
3385
return 0 ;
3360
3386
}
3361
3387
}
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 );
3371
3389
if (!attached ) {
3372
3390
if ((* jvm )-> DetachCurrentThread (jvm ) != 0 ) {
3373
3391
fprintf (stderr , "JNA: could not detach thread on initial load\n" );
3374
3392
}
3375
3393
}
3376
-
3377
3394
return result ;
3378
3395
}
3379
3396
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 ) {
3382
3411
jobject * refs [] = {
3383
3412
& classObject , & classClass , & classMethod ,
3384
3413
& classString ,
@@ -3443,6 +3472,16 @@ JNI_OnUnload(JavaVM *vm, void *UNUSED(reserved)) {
3443
3472
}
3444
3473
}
3445
3474
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
+
3446
3485
JNIEXPORT void JNICALL
3447
3486
Java_com_sun_jna_Native_unregister (JNIEnv * env , jclass UNUSED (ncls ), jclass cls , jlongArray handles ) {
3448
3487
jlong * data = (* env )-> GetLongArrayElements (env , handles , NULL );
0 commit comments