如何从jni端调用java方法?

如何从jni端调用java方法?,java,java-native-interface,pthreads,android-ndk,Java,Java Native Interface,Pthreads,Android Ndk,我已经在jni端完成了一些c代码函数,所有的工作都很好 public native String getMessage() 函数将字符串从jni端返回到java端,它可以正常工作,所有其他jni代码也可以正常工作。但问题是,我如何在jni函数中返回字符串,而不使用return,所以 public native void getMessagewithoutReturn() 应该能够返回字符串。然后我使用pthread创建了getMessagewithoutReturn函数永无止境的循环,如下

我已经在jni端完成了一些c代码函数,所有的工作都很好

public native String getMessage() 
函数将字符串从jni端返回到java端,它可以正常工作,所有其他jni代码也可以正常工作。但问题是,我如何在jni函数中返回字符串,而不使用return,所以

public native void getMessagewithoutReturn()
应该能够返回字符串。然后我使用pthread创建了getMessagewithoutReturn函数永无止境的循环,如下所示:它可以工作

pthread_t native_thread;
pthread_create(&native_thread, NULL, native_thread_start_reading, env);
每次循环迭代时,我必须能够返回字符串,所以我不能使用return,因为它会停止函数的运行

pthread_t native_thread;
pthread_create(&native_thread, NULL, native_thread_start_reading, env);sted out that 
我已经测试过posix线程,所有这些在android端都可以正常工作,因为它并没有启动工作线程,但现在的问题是在每次迭代时获取字符串,而不使用函数return

我的建议:

创建一个将接收字符串的类。您还可以使用接口或抽象类:

class ResultHandler { 
    public void onReturnedString(String str) 
    { 
        /* Do something with the string */ 
    } 
}
然后更改函数的原型:

public native void getMessagewithoutReturn(ResultHandler handler);
本机函数将变为:

void  Java_com_foo_bar_getMessagewithoutReturn(JNIEnv *env, jobject thiz, jobject handler);
现在必须调用处理程序的onReturnedString,因此必须使用JNI函数:

 jmethodID mid;
 jclass handlerClass = (*env)->FindClass(env, "com/foo/bar/ResultHandler");
 if (handlerClass == NULL) {
     /* error handling */
 }
 mid = (*env)->GetMethodID(env, handlerClass, "onReturnedString", "(Ljava/lang/String;)V");
 if (mid == NULL) {
     /* error handling */
 }
然后,当您需要调用函数时:我假设resultString是一个jstring

 (*env)->CallVoidMethod(env, handler, mid, resultString);
我没有测试代码,但你有基本的想法


一些参考资料和示例代码

谢谢您的帮助,我尝试了一下,但我认为应该可以,因为它使用的是可以排队的处理程序!