java - 如何使用 JNI 将 Java 中的 ArrayList<Integer> 转换为 C++ int 数组?

标签 java c++ arraylist java-native-interface

我正在使用 JNI 在我的 Java 客户端中调用 C++ 方法。在其中一种方法中,我传入了一个整数 ArrayList 并希望在 C++ 中得到一个整数数组。当我通过 JNI 传递 ArrayList 时,我得到一个 jObject。如何将该对象转换为整数数组?

我发现这篇文章很相似,但使用了一个字符串数组列表: JNI - java ArrayList conversion to c++ std::string*

关于如何修改确实使用整数的任何想法?我尝试将 std::string 引用更改为 int,但没有成功。

最佳答案

首先意识到ArrayList<>是一个泛型,而JNI对泛型一无所知。基本上,对于 JNI,ArrayList 是 ArrayList。其次,您肯定是在谈论 ArrayList,而不是 ArrayList,因为第二个是不可能的(参见 Why I can't have int in the type of ArrayList?)。让我们看看在 C++ 中将其转换为 int[]。我不打算在这里编写编译代码,因为 JNI 是一个非常乏味的 PITA,但这是正确的想法,没有所有臃肿的错误检查,您还需要 ;-)

仅供引用,任何调用超过 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/