【问题标题】:How can I convert ArrayList<Integer> in Java to C++ int array using JNI?如何使用 JNI 将 Java 中的 ArrayList<Integer> 转换为 C++ int 数组?
【发布时间】:2014-10-01 16:57:57
【问题描述】:

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

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

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

【问题讨论】:

  • This 可能会有所帮助。
  • 似乎在做相反的事情,将数组列表传回给java。这不是我遇到问题的 JNI,而是我遇到问题的从 jObject 到整数数组的转换(其中 jObject 是 java 中的整数数组列表)
  • 只需通过 jni 的 size() 和 get(int) 方法遍历 arrayList 对象
  • ... 或将 ArrayList 转换回 int[] 然后再传回。

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


【解决方案1】:

首先意识到 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-wrapper-generators。我们自己编写了自己的代码,但我听说有一些值得尊敬的开放和商业工具。

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2011-01-27
    • 2010-10-27
    • 1970-01-01
    相关资源
    最近更新 更多