在示例程序中找不到JNI_OnLoad_libname

问题描述:

我该如何从Java调用本地静态库?我正在使用Java 8.在示例程序中找不到JNI_OnLoad_libname

它看起来像我应该能够在一个嵌入式JVM的C++程序中定义一个JNI_OnLoad_library,但是当我调用System.loadLibrary时,我的VM会一直死去。以下仅打印“来自main的Hello”。

main.cpp中:

#include <jni.h> 
#include <iostream> 

extern "C" { 
    JNIEXPORT jint JNI_OnLoad_hello(JavaVM *vm, void *reserved) { 
     std::cout << "Hello World" << std::endl; 
     return JNI_VERSION_1_8; 
    } 
} 

int main(int argc, char** argv) { 
    JavaVM *jvm; 
    JNIEnv *env; 
    JavaVMInitArgs vm_args; 
    jint error; 

    JavaVMOption* options = new JavaVMOption[argc-1]; 
    for(int i = 0;i < argc-1;i++) { 
     options[i].optionString = argv[i+1]; 
    } 

    vm_args.nOptions = argc-1; 
    vm_args.options = options; 

    vm_args.version = JNI_VERSION_1_8; 

    JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 
    jclass cls = env->FindClass("Main"); 
    jclass stringCls = env->FindClass("java/lang/String"); 
    jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); 
    jobjectArray mainArgs = env->NewObjectArray(0, stringCls, NULL); 
    env->CallStaticVoidMethod(cls, mid, mainArgs); 
    jvm->DestroyJavaVM(); 
} 

Main.java:

class Main { 
    public static void main(String[] args) { 
     try { 
      System.out.println("Hello from main"); 
      System.loadLibrary("hello"); 
      System.out.println("Hello after main"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我终于能拿到JVM通过传递--export动态链接器,来找到JNI_OnLoad_hello。这允许共享库通过在可执行文件中查找符号来解析符号。另外,System.loadLibrary像我怀疑的抛出UnsatisfiedLikeErrors,但出于某种原因,我必须使用CheckException和DescribeException在JNI中处理它们。