我正在使用 JNI 在我的 Java 客户端中调用 C++ 方法。在其中一种方法中,我传入了一个整数 ArrayList 并希望在 C++ 中得到一个整数数组。当我通过 JNI 传递 ArrayList 时,我得到一个 jObject。如何将该对象转换为整数数组?
我发现这篇文章很相似,但使用了一个字符串数组列表: JNI - java ArrayList conversion to c++ std::string*
关于如何修改确实使用整数的任何想法?我尝试将 std::string 引用更改为 int,但没有成功。
最佳答案
首先意识到ArrayList<>是一个泛型,而JNI对泛型一无所知。基本上,对于 JNI,ArrayList
仅供引用,任何调用超过 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);
}
关于java - 如何使用 JNI 将 Java 中的 ArrayList<Integer> 转换为 C++ int 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26146540/