2014-10-01 125 views
3

我正在使用JNI在我的java客戶端中調用C++方法。在其中一種方法中,我傳遞了一個整數的ArrayList,並希望在C++中獲得一個整數數組。當我通過JNI傳遞ArrayList時,我得到一個jObject。如何將該對象轉換爲整型數組?如何使用JNI將Java中的ArrayList <Integer>轉換爲C++ int數組?

我發現這個職位類似,但使用字符串的ArrayList: JNI - java ArrayList conversion to c++ std::string*

關於如何修改那些使用整數任何想法?我試着將std :: string refrences改爲int,但沒有運氣。

+0

[This](http://stackoverflow.com/questions/7776800/convert-vector-to-jobject-in-c-jni)可能會有所幫助。 – 2014-10-01 17:01:57

+0

似乎正在做相反的事情,將一個arraylist傳回給java。它不是我遇到麻煩的JNI,它是從jObject到整數數組的轉換,我遇到了問題(其中jObject是java中整數列表的數組) – user2482725 2014-10-01 17:14:53

+0

只需通過它的大小移動arrayList對象()和get(int)方法通過jni – Samhain 2014-10-01 17:19:39

回答

3

首先認識到ArrayList <>是泛型的,JNI對泛型沒有任何認識。基本上,對於JNI,ArrayList < T>是ArrayList < Object>。其次,你肯定是在談論ArrayList < Integer>,而不是ArrayList < int>,因爲第二個是不可能的(見Why I can't have int in the type of ArrayList?)。我們來看看如何將它轉換爲C++中的int []。我不打算編寫在這裏編譯的代碼,因爲JNI是一個非常繁瑣的PITA,但這是正確的想法,沒有所有的臃腫的錯誤檢查,你也將需要;-)

FYI,任何調用超過10個JNI方法的人都會開始爲C++尋找JNI包裝生成器。我們自己寫了自己的內容,但是我聽說有可敬的開放和商業工具。

jobject arrayObj = ... 
jclass arrayClass = env->FindClass("java/util/ArrayList"); 
jmethodID sizeMid = env->GetMethodID(arrayClass, "size", "()I"); 
jclass integerClass = env->FindClass("java/lang/Integer"); 
jmethodID intValueMid = env->GetMethodID(integerClass, "intValue", "()I"); 
jvalue arg; 
jint size = env->CallIntMethodA(arrayObj, sizeMid, &arg); 
int* cppArray = new int[size]; 
jmethodID getMid = env->GetMethodID(arrayClass, "get", "(I)Ljava/lang/Object;"); 
for (int i = 0; i < size; i++) { 
    arg.i = i; 
    jobject element = env->CallIntMethodA(arrayObj, getMid, &arg); 
    appArray[i] = env->CallIntMethodA(element, intValueMid, &arg); 
    // you can't have an unlimited number of active local references. 
    vm->DeleteLocalRef(element); 
} 
相關問題