2013-12-13 80 views
1

我的Java類的靜態函數定義如下:通過C++發送參數到Java

public static void logEvent(final String eventName, final String jObject) { 
     //Function data 
    } 

現在我的cpp文件具有以下功能

void PingoScreen::callApslarIntegration(){ 
    char* eventName="bingo"; 
    JniMethodInfo t; 

if (JniHelper::getStaticMethodInfo(t, "com/myapp/test/ApslarSetup","logEvent", "()V")) { 
    t.env->CallStaticVoidMethod(t.classID, t.methodID); 
    t.env->DeleteLocalRef(t.classID); 
    } 
} 

我怎麼能發送兩個字符串PARAMS到通過JNI的JAVA功能?

親切的問候

======================================== =======================

void PingoScreen::callApsIntegration() { 

    JniMethodInfo t; 

    if (JniHelper::getStaticMethodInfo(t, "com/myapp/test/ApslarSetup", 
      "logJSONEvent", "()V")) { 

     const char* cstr1 = "Test1"; 
     const char* cstr2 = "Test2"; 

     jstring jstr1 = t.env->NewStringUTF(cstr1); 
     jstring jstr2 = t.env->NewStringUTF(cstr2); 

     t.env->CallStaticVoidMethod(t.classID, t.methodID,jstr1,jstr2); 
     t.env->DeleteLocalRef(t.classID); 
    } 
} 

上面的函數會導致崩潰?

==================================

終於得到它的工作

void PingoScreen::callApslarIntegration() { 
    JniMethodInfo t; 
    if (JniHelper::getStaticMethodInfo 
       (t, "com/nbs/test/ApslarSetup", 
       "logJSONEvent", 
       "(Ljava/lang/String;Ljava/lang/String;)V")) { 

     const char* cstr1 = "Test1"; 
     const char* cstr2 = "Test2"; 

     jstring jstr1 = t.env->NewStringUTF(cstr1); 
     jstring jstr2 = t.env->NewStringUTF(cstr2); 

     t.env->CallStaticVoidMethod(t.classID, t.methodID,jstr1,jstr2); 
     t.env->DeleteLocalRef(t.classID); 
    } 
} 

墜機是由於線路

if (JniHelper::getStaticMethodInfo 
        (t, "com/nbs/test/ApslarSetup", 
        "logJSONEvent", 
        "(Ljava/lang/String;Ljava/lang/String;)V")) 

的signiture必須是Ljava/lang/String;Ljava/lang/String;和不Ljava/lang/String;Ljava/lang/String(注意最後分號)

+1

提示:使用'javap -s -public com.nbs.test.ApslarSetup | egrep -A 2「logJSONEvent」'獲取要與JNI一起使用的簽名。 –

回答

2

如果你想使用CallStaticVoidMethod,只是傳遞兩個jstring s到它,像這樣:

const char* cstr1 = "Test1"; 
const char* cstr2 = "Test2"; 
jstring jstr1 = t.env->NewStringUTF(cstr1); 
jstring jstr2 = t.env->NewStringUTF(cstr2); 
t.env->CallStaticVoidMethod(t.classID, t.methodID, jstr1, jstr2); 

您還可以使用CallStaticVoidMethodACallStaticVoidMethodV而不是簡單地CallStaticVoidMethod。請參閱documentation here

+0

我編輯了我的問題與更新的功能。它導致崩潰? – AndroidDev

+1

任何錯誤日誌?我不是通過電腦來測試它。如果問題出在我寫的東西上,那就是我創建jstrings的方式,所以你可以通過谷歌搜索找到更快的東西... – Dave

+0

只是C堆棧strace,似乎對我而言不可辨別? – AndroidDev