Jar*_*ary 3 methods java-native-interface android
我遇到了JNI的问题,调用从C++到Java的方法.
我试图调用一个带有布尔值的void方法.我的java代码如下:
public void setStatus(boolean bool) {
// Do stuff...
}
public native void initialize(int defaultPort);
Run Code Online (Sandbox Code Playgroud)
在我的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);
}
Run Code Online (Sandbox Code Playgroud)
在实际的函数中,我试图获取类,然后是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);
}
Run Code Online (Sandbox Code Playgroud)
我很难用JNI进行调试.我已经尝试在setStatus()中在Eclipse中放置一个断点但它永远不会被调用.exit()也不会被调用.程序会踩踏一两秒,然后继续.我不确定发生了什么.
有人可以帮帮我吗?
非常感谢你.
你不能将env指针传递给其他线程.您需要将线程加入JVM.
在原始线程中,调用GetJavaVM获取JavaVM指针:
JavaVM *vm = 0;
env->GetJavaVM(&vm);
Run Code Online (Sandbox Code Playgroud)
然后在另一个线程中,将VM附加到该线程并获取一个新env指针:
vm->AttachCurrentThread(&env, 0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2856 次 |
| 最近记录: |