JNI调用在驱动程序callback中失败

我正在开发一个与硬件设备交互的应用程序。 使用硬件的官方应用程序提供的DLL文件,我初始化设备,并注册一些函数作为callback被调用一些用户交互。 在这个callback函数中,我想调用一个Java函数来传输数据。 但是,整个应用程序在callback中仅在此调用中退出时没有任何错误日志:

jclass cls = env->FindClass("java/lang/String"); 

如果在Java直接调用的函数中执行相同的调用。 这种行为的原因是什么? 从设备驱动调用中调用JNI有什么不同? 任何帮助表示赞赏。

编辑:我试过Vernee的build议,并试图将驱动程序线程附加到JVM,但行为并没有改变。 而且,我丢失了printf输出,这是我唯一selectdebuggingJNI的方法。 他们在附加操作之前工作,但之后停止工作。

如果您在Windows上开发,我强烈建议您使用visual studio来调试C代码。 你可以启动你的java程序,并在System.load上放置一个断点,当Java程序停止在这个时候,转到Visual Studio并从tools> attach进程,这样就可以停止放置在C代码中的断点。 之后,只需恢复Java代码。 从C线程调用java方法需要一些准备工作:

1-高速缓存JVM对象

 JavaVM * javaVm; (*jenv)->GetJavaVM(jenv, &javaVm); 

2-缓存包含您的java回调方法的Class的Class对象。

 clazz = (*jenv)->NewGlobalRef(jenv, (*jenv)->FindClass(jenv, "com/something/somepackage/SomeClass")); 

3-如果您正在调用实例方法,则还需要调用正在调用的实例

 callback = (*jenv)->NewGlobalRef(jenv, callbackInstance); 

4-将本地线程附加到虚拟机(当您需要调用java方法时)

 JNIEnv * jenv; int errorCode = (*j_javaVm)->AttachCurrentThread(j_javaVm, (void**) &jenv, NULL); 

5-获取您需要调用的方法ID(当您需要调用java方法时)

 jmethodID methodID = (*jenv)->GetMethodID(jenv, cachedhandlerClass, "methodNameHere", "methodSignetureHere"); 

6-进行方法调用

 (*jenv)->CallVoidMethod(jenv, cachedCallbackInstance, methodID, param1, param2,....); 

7-解除本地线程

 (*j_javaVm)->DetachCurrentThread(j_javaVm); 

步骤1,2和3需要一个Java环境,可以用JNI_OnLoad方法或本地Java方法的实现来完成。