首先認識到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);
}
[This](http://stackoverflow.com/questions/7776800/convert-vector-to-jobject-in-c-jni)可能會有所幫助。 – 2014-10-01 17:01:57
似乎正在做相反的事情,將一個arraylist傳回給java。它不是我遇到麻煩的JNI,它是從jObject到整數數組的轉換,我遇到了問題(其中jObject是java中整數列表的數組) – user2482725 2014-10-01 17:14:53
只需通過它的大小移動arrayList對象()和get(int)方法通過jni – Samhain 2014-10-01 17:19:39