JNI:从 JVM 到 C++ 的回调无法运行
JNI: Callback from JVM to C++ fails to run
我从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 类调用库中的任何功能。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 如果事件在仍在执行时再次设置,RegisterWaitForSingleObject 是否会并行运行回调?
- 与Qt同时运行后台循环或回调C++应用程序?
- libevent是否允许在不同的线程中运行timer/io的回调
- 为什么我的 Windows API 回调函数不运行?
- 通过功能指针通过DLL进行回调功能,运行时检查失败#0错误
- 在c++中使用回调异步运行linux命令
- JNI:从 JVM 到 C++ 的回调无法运行
- 苹果运行循环的回调方法
- boost::asio,为什么我的socket在调用async_receive_from后立即运行回调函数
- JNI 回调时出现运行时错误
- C++回调函数运行时错误
- 如何使用boost运行线程另一个对象函数与回调
- 在c++中运行外部应用程序的回调
- GLUT只运行一次显示回调,不输出到终端
- 在运行时改变参数时通过另一个模块回调(重新建立)一个模块