2011-09-24 78 views
1

據我所知,我不能從C++中調用從Java字符串數組返回的方法,所以只有解決這個問題的方法是循環調用方法,它將返回一個數組元素,但是如何將它們存儲在C++數組中?如何從C++調用Java方法(java返回String [])?

在Java我有方法:

public static String getData(int index){ return arry[index]; } 

和在C++:

char * args[10]; 
for (int i = 0; i < arrayLength; i ++) { 
    jmethodID mid = env->GetStaticMethodID(INF.cls_JSox, "getData",(I)Ljava/lang/String;"); 
    jobject result = env->CallStaticObjectMethod(cls, mid, num, i); 
    const char *nativeString = env->GetStringUTFChars((jstring) result, 0); 
    const size_t len = strlen(nativeString); 
    cout << "copying... \n"; 
    strncpy(args[i], nativeString, len); 
    env->ReleaseStringUTFChars((jstring)result, nativeString); 
} 

但當i = 1我發現了存儲器衝突錯誤在Java中。我怎樣才能正確地從收到的字符串中複製數據到char * args[10]?從Java傳遞的每個字符串的長度約爲3-5個字符。

+0

絕對有可能使用JNI來調用返回字符串數組的Java方法。 –

+0

'GetStaticMethodID'中的'INF.cls_JSox'是否與CallStaticObjectMethod中的'cls'指向相同的類? – jogabonito

回答

4

假設您發佈的C++代碼片段已完成,您將獲得訪問衝突,因爲在將值複製到其中之前需要分配args[i] - args[i] = new char[ len + 1 ]會執行此操作。

實際上,你可以從C++返回一個Java字符串數組調用一個方法,假設你的方法是:

public static String[] getData() { return array; } 

然後在本地方面,你應該能夠做這樣的事情:

jmethodID method = env->GetStaticMethodID(cls, "getData", "()[Ljava/lang/String;"); 
jarray data = (jarray) env->CallStaticObjectMethod(cls, method); 

// assumption: the result of getData() is never null 
jsize const length = env->GetArrayLength(data); 

// assumption: the String[] is always of length > 0 
char** args = new char*[ length ]; 

for(jsize index(0); index < length; ++index) 
{ 
    jstring element = (jstring) env->GetObjectArrayElement(array, index); 

    // assumption: there are no null strings in the array 
    char const* nativeString = env->GetStringUTFChars(element, 0); 
    jsize const nativeLength = strlen(nativeString); 

    args[index] = new char[ nativeLength + 1 ]; 
    strncpy(args[index], nativeString, nativeLength); 

    env->ReleaseStringUTFChars(element, nativeString); 
} 

我還沒有試過編譯上面的代碼片段,所以可能有一兩個錯誤,但它應該是一個好的起點。我已經使用char *數組和本地字符串離開了代碼,因此在某些時候代碼將不得不在數組的每個成員和數組本身上調用delete[]。使用std::vectorstd::string作爲內存管理的最終結果可能會更簡單,這取決於提供的字符串將如何使用。