简体   繁体   English

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

[英]JNI: Callback from JVM to C++ fails to run

I start JVM from C++ program. 我从C ++程序启动JVM。

C++ code: 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, ...);
}

then I need my C++ function called back from java: 然后我需要从Java调用的C ++函数:

Java code: Java代码:

native void callBackIntoNative(long ptr);

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

When I run my C++ program, JVM starts correctly, but after it prints "Calling callBackIntoNative()" the following acception appears: 当我运行C ++程序时,JVM正确启动,但是在它显示“ Calling callBackIntoNative()”之后,将出现以下接受:

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

Can you please help? 你能帮忙吗?

Thanks, but I found a solution: I should have registered my C++ function as a native method using the code: 谢谢,但是我找到了一个解决方案:我应该使用以下代码将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);

Now it works fine. 现在工作正常。

I would compile your callback apart into a dynamic library (.dll, .so, whatever your OS) and put it accesible to your java program. 我会将您的回调分别编译成一个动态库(.dll,.so,无论您使用什么操作系统),并将其放入您的Java程序中。 Then you just load your library by using JNI and call from your java classes whatever functionality you have in the library. 然后,您只需使用JNI加载库,然后从Java类中调用库中具有的任何功能。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM