JNI:从JVM到C ++的回调无法运行

我从C ++程序启动JVM。

C ++代码:

JNIEXPORT jobject JNICALL com_javelin_JavelinMarketData_callBackIntoNative(JNIEnv* env, jobject obj, jlong ptr) { std::cout << "com_javelin_JavelinMarketData_callBackIntoNative called" <GetStaticMethodID(helloWorldClass, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(helloWorldClass, mainMethod, ...); } 

然后我需要从java回调的C ++函数:

Java代码:

 native void callBackIntoNative(long ptr); public void onResponse(long param) { System.out.println("Calling callBackIntoNative()"); callBackIntoNative(param); } 

当我运行我的C ++程序时,JVM正确启动,但在打印“Calling callBackIntoNative()”后,会出现以下接受:

 Exception during callBackIntoNative(): 'com.javelin.JavelinMarketData.callBackIntoNative(J)V' java.lang.UnsatisfiedLinkError: com.javelin.JavelinMarketData.callBackIntoNative(J)V 

你能帮忙吗?

谢谢,但我找到了一个解决方案:我应该使用代码将我的C ++函数注册为本机方法:

 const JNINativeMethod methods[] = { { "callBackIntoNative", "(J)V", (void*)&com_javelin_JavelinMarketData_callBackIntoNative } }; const int methods_size = sizeof(methods) / sizeof(methods[0]); jclass jClass = env->FindClass("com/javelin/JavelinMarketData"); env->RegisterNatives(jClass, methods, methods_size); 

现在它工作正常。

我会将你的回调编译成一个动态库(.dll,.so,无论你的操作系统),并将它可以访问你的java程序。 然后,您只需使用JNI加载库,并从库中调用库中的任何function。