Android JNI从C++; 我有一个JNI问题,从C++调用java的方法。< /P>
我试图调用一个采用布尔值的void方法。我的java代码如下所示:Android JNI从C++; 我有一个JNI问题,从C++调用java的方法。< /P>,android,methods,java-native-interface,Android,Methods,Java Native Interface,我试图调用一个采用布尔值的void方法。我的java代码如下所示: public void setStatus(boolean bool) { // Do stuff... } public native void initialize(int defaultPort); 在我的C++代码中,我正在构造一个结构来保存Env和对象并将其传递给线程: JNIEXPORT void JNICALL Java_com_device_client_HostConnection_initiali
public void setStatus(boolean bool) {
// Do stuff...
}
public native void initialize(int defaultPort);
在我的C++代码中,我正在构造一个结构来保存Env和对象并将其传递给线程:
JNIEXPORT void JNICALL Java_com_device_client_HostConnection_initialize
(JNIEnv * env, jobject obj, jint port)
{
struct javaInfo* data = (struct javaInfo*) malloc(sizeof(struct javaInfo));
data->env = env;
data->javaObjHost = obj;
pthread_t pth;
pthread_create(&pth, NULL, startServer, (void *) data);
free(data);
}
在实际函数中,我尝试先获取类,然后获取MethodID,然后调用void方法,如下所示:
void *startServer(void* arg) {
struct javaInfo* data = (struct javaInfo*) arg;
JNIEnv* env = data->env;
jobject javaObjHost = data->javaObjHost;
cls = env->GetObjectClass(javaObjHost);
mid = env->GetMethodID(cls, "setStatus", "(Z)V");
if (mid == 0) {
exit(-1);
}
env->CallVoidMethod(javaObjHost, mid, true);
}
我很难用JNI进行调试。我曾尝试在Eclipse中的setStatus()中设置断点,但从未调用过。也不调用exit()。程序跺了一两秒钟,然后继续。我不知道发生了什么事
谁能帮帮我吗
非常感谢。您不能将env指针传递给其他线程。您需要将线程连接到JVM 在原始线程中,调用
GetJavaVM
以获取JavaVM
指针:
JavaVM *vm = 0;
env->GetJavaVM(&vm);
vm->AttachCurrentThread(&env, 0);
然后在另一个线程中,将VM连接到该线程并获取一个新的env
指针:
JavaVM *vm = 0;
env->GetJavaVM(&vm);
vm->AttachCurrentThread(&env, 0);
谢谢!成功了!我必须做两个微小的修改:env->GetJavaVM(&vm);和vm->AttachCurrentThread(&env,0);谢谢!你帮了大忙!事实上,我有一个小问题。有时AttachCurrentThread会使我的代码崩溃。它给了我一个SIGSEGV:I/DEBUG(4633):信号11(SIGSEGV),故障地址00000010我已经添加了一个检查以确保vm!=空,但这没有帮助。有什么线索吗?地址00000010意味着从NULL跳到偏移量。尝试从线程中记录vm指针的值,当出现问题时,它可能为空。感谢您的帮助,我已经修复了它。我调用了free(data),但是线程不会读取void*arg的内容,所以它会尝试读取空指针。我刚刚删除了免费的。非常感谢。