使用JNI将Java Collection <integer>类型转换为R对象

时间:2015-10-07 01:36:03

标签: java r java-native-interface

我有一个返回collection<"Integer">的java方法,我想在R中使用它.java方法是

public Collection<Integer> search( ){ ....}

使用JNI,R中这个(Java集合)对象的类型应该是什么。我尝试使用"[I",这意味着整数数组,但它没有用。

1 个答案:

答案 0 :(得分:1)

Collection<Integer>是通过参数化通用接口Collection创建的类型,它允许对Collection<Integer>的使用执行一些编译时健全性检查。

但是,在运行时,Collection<Integer>剩下的只是the raw type Collection。因此,如果您尝试使用FindClass找到合适的课程,则应该查找java.util.Collection,即"java/util/Collection"

一旦你有了对该类的引用和对该类实例的引用,你就可以使用toArray中的Collection方法获取一个普通的Integer对象数组,如果这就是你想要的。

一个小的半无意义的例子(假设你有jobject intColl指的是你的Collection<Integer>):

// Get an array of Objects corresponding to the Collection
jclass collClass = env->FindClass("java/util/Collection");
jmethodID collToArray = env->GetMethodID(collClass, "toArray", "()[Ljava/lang/Object;");
jobjectArray integerArray = (jobjectArray) env->CallObjectMethod(intColl, collToArray);

// Get the first element from the array, and then extract its value as an int
jclass integerClass = env->FindClass("java/lang/Integer");
jmethodID intValue = env->GetMethodID(integerClass, "intValue", "()I");
jobject firstInteger = (jobject) env->GetObjectArrayElement(integerArray, 0);
int i = env->CallIntMethod(firstInteger, intValue);

__android_log_print(ANDROID_LOG_VERBOSE, "Test", "The value of the first Integer is %d", i);

env->DeleteLocalRef(firstInteger);
env->DeleteLocalRef(integerArray);