2011-05-19 143 views
1

我已经在jni方面做了一些c代码功能,并且所有工作都很好。如何从jni端调用java方法?

public native String getMessage() 

函数从jni端返回字符串到java端,它工作正常,所有其他jni代码工作也很好。但一个问题是,如何在jni函数中返回字符串而不使用返回,所以

public native void getMessagewithoutReturn() 

应该能够返回字符串。然后,我却getMessagewithoutReturn()函数中使用并行线程如下,你可以看到永无止境的循环:(它的工作原理)

pthread_t native_thread; 
pthread_create(&native_thread, NULL, native_thread_start_reading, env); 

和每次循环迭代时我必须要能够返回字符串,所以我不能使用回,因为它会停止功能运行。

pthread_t native_thread; 
pthread_create(&native_thread, NULL, native_thread_start_reading, env);sted out that 

我测试的是POSIX线程和所有工作在Android的侧面很好,因为它已经无法启动工作线程,但现在只是问题得到每次迭代的时间字符串,不使用函数返回。

回答

9

我的建议:

创建一个将收到串类(你也可以使用一个接口或抽象类):

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); 

我没有测试代码,但你有基本的想法。

一些参考和示例代码here

+0

感谢您的帮助我尝试,但我认为它应该是作品,因为它是使用处理器可以排队! – user760503 2011-05-20 06:15:22