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

JNI: Callback from JVM to C++ fails to run

本文关键字:回调 运行 C++ JVM JNI      更新时间:2023-10-16

我从C++程序启动JVM。

C++代码:

JNIEXPORT jobject JNICALL com_javelin_JavelinMarketData_callBackIntoNative(JNIEnv* env, jobject obj, jlong ptr)
{
        std::cout << "com_javelin_JavelinMarketData_callBackIntoNative called" << std::endl;
}
int main()
{
       JavaVM* jvm;
       JNIEnv* env;
       ...
       JNI_CreateJavaVM(&jvm, (void **)&env, &args);
       jmethodID mainMethod =  env->GetStaticMethodID(helloWorldClass, "main", "([Ljava/lang/String;)V");
       env->CallStaticVoidMethod(helloWorldClass, mainMethod, ...);
}

那么我需要从 java 调用我的C++函数:

爪哇代码:

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 加载库,并从 java 类调用库中的任何功能。