use*_*725 4 c++ java java-native-interface arraylist
我正在使用 JNI 在我的 java 客户端中调用 C++ 方法。在其中一个方法中,我传入一个整数 ArrayList,并希望在 C++ 中获取一个整数数组。当我通过 JNI 传递 ArrayList 时,我得到一个 jObject。如何将该对象转换为整数数组?
我发现这篇文章类似,但使用字符串数组列表: JNI - java ArrayList conversion to c++ std::string*
关于如何修改确实使用整数的任何想法?我尝试将 std::string 引用更改为 int,但没有成功。
首先意识到 ArrayList<> 是泛型,而 JNI 对泛型一无所知。基本上,对于 JNI,ArrayList<T> 是 ArrayList<Object>。其次,您肯定是在谈论 ArrayList<Integer>,而不是 ArrayList<int>,因为第二个是不可能的(请参阅为什么我不能在 ArrayList 的类型中使用 int?)。让我们看看在 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4289 次 |
| 最近记录: |