2011-05-19 65 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