我的c ++ lib与我的应用程序一起使用。我将java对象传递给jni并将其保存到全局引用。然后,我希望从antoher线程中调用jni中的这个java对象的方法(我使用pthread)。
Java类是:
public class WaitingServiceReadyCallback {
public void ready(String serviceName) throws Exception { ... // some code }
}
要调用java方法,我使用下一个代码:
jvm->AttachCurrentThread(&env, 0);
cls = env->GetObjectClass(__obj__); // __obj__ is global reference to object.
if (!cls)
goto detach;
mid = env->GetMethodID(cls, "ready", "(Ljava/lang/String;)V");
GetMethodID
找不到方法。
当我使用
cls = env->FindClass("com/mypackage/WaitingServiceReadyCallback");
而不是GetObjectClass
,FindClass
无法找到此类。
我尝试通过__obj__
全局引用检查对象引用的类名称(getName
使用com/java/Class
,在我的同一位置调用getName
上面的代码调用了ready
),我得到了正确的类名 - com.mypackage.WaitingServiceReadyCallback
。
我确信该类存在并加载(在jni之前执行java代码并在那里创建此类的实例),我确信该方法存在于该类中。
所以,我无法理解,我做错了什么?
答案 0 :(得分:2)
我遇到了这个问题。简而言之:在另一个线程中VM没有向我们提供有关已加载类的信息。我通过存储一些示例java对象的类加载器然后使用它来从另一个线程手动加载所需的类来解决这个问题。