2012-02-07 73 views
0

我用Java編寫的Android項目,它使用了一些openGL的東西NDK ..NDK,從C++傳遞原始數據到Java

我有一段cpp的函數,得到的號召,從那裏我想打電話給一個Java函數

C++:

JNIEXPORT void JNICALL 
Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_renderFrame(JNIEnv* env, jobject obj) 
{ 
jclass activityClass = env->GetObjectClass(obj); 

// Do something 
char* argToPass = "Some string"; 
     jmethodID functionID = env->GetMethodID(activityClass, 
                "CallBack", "()V"); 
     env->CallObjectMethod(obj, functionID, 0); 
} 

的Java:

public void CallBack(string arg){ 
// Do sometihng 
} 

的問題是如何做我通過argToPass參數傳遞給Java函數

謝謝...

回答

1

See here爲關於通過jni調用java方法的詳細描述。

看起來你是方法簽名是錯誤的。上面的鏈接對如何確定您的方法簽名有很好的描述。這是你的GetMethodID通話應該是什麼樣子:

jmethodID functionID = env->GetMethodID(
    activityClass, 
    "CallBack", 
    "(Ljava/lang/String;)V"); 

然後,當你打電話給你的方法,你會做它像這樣:

env->CallVoidMethod(
    obj, 
    functionID, 
    env->NewStringUTF(argToPass)); 

請注意,我用CallVoidMethod,因爲在Java中的返回值是無效。

0

要創建一個可以傳遞或返回到Java字符串,使用NewStringUTF():

JNIEXPORT jstring JNICALL Java_com_something_or_other_makeString(JNIEnv *env, jobject obj) 
{ 
char *myString = "This is a test"; 
return (*env)->NewStringUTF(env, myString); 
} 
+0

謝謝,但C++函數是無效的類型 – ibm123 2012-02-07 16:37:21

+0

我知道 - 我用這種方式展示瞭如何創建Java兼容字符串。您可以將它傳遞給Java函數或返回它。 – BitBank 2012-02-07 16:42:03