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

标签 java c++ callback jvm java-native-interface

我从 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++ 函数:

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);

现在它工作正常。

关于java - JNI : Callback from JVM to C++ fails to run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21734086/

相关文章:

java - 生成特定范围内的带有标准偏差的随机数?

c++ - 错误 : invalid use of member in static member function

c++ - 为什么小于 4 字节的整数类型的位操作会出现异常?

c++ - std::function到C样式的函数指针

javascript .catch() 的一个回调和 .then() 的另一个回调?

javascript - 在 Angular 4 中从先前的 http 响应成功调用 http 请求(避免回调 hell )

java - 让静态方法负责创建它所在类的对象是否明智?

java - Spring Cloud 流卡夫卡 : Duplicate @StreamListener mapping for 'input'

java - 对 ArrayList<String> 元素执行字符串追加和算术运算

c++ - 创建线程时编译器错误