[英]JNI - Instantiate Java ArrayList from C++ Vector
我试图通过使用本机函数调用其方法来创建一个包含Java类的ArrayList
。 Java类ExampleClass
如下所示:
public class ExampleClass {
private int _exampleID;
private String _exampleName;
public ExampleClass(int exampleID, String exampleName) {
_exampleID = exampleID;
_exampleName = exampleName;
}
}
在本地方面,我有一个免费的类ExampleClass_Cpp
,它被加载到向量中。 这是本机实现:
static thread_local JNIEnv* env;
static jclass java_util_ArrayList = static_cast<jclass>(env->NewGlobalRef(env->FindClass("java/util/ArrayList")));
static jmethodID java_util_ArrayList_= env->GetMethodID(java_util_ArrayList, "<init>", "(I)V");
jmethodID java_util_ArrayList_add = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)V");
JNIEXPORT jobject JNICALL cppv2javaAL(JNIEnv *env) {
std::vector<ExampleClass_Cpp> vector;
jclass J_Class_Example = env->FindClass("app/androidndkproject/ExampleClass");
jmethodID methodId = env->GetMethodID(J_Class_Example, "<init>", "(I)V");
jobject result = env->NewObject(java_util_ArrayList, java_util_ArrayList_, vector.size());
for (auto const &Ex: vector) {
jobject J_Obj_Example = env->NewObject(J_Class_Example, methodId, Ex.getExampleID(), Ex.getExampleName());
env->CallVoidMethod(result, java_util_ArrayList_add, J_Obj_Example);
env->DeleteLocalRef(J_Obj_Example);
}
return result;
}
我在使用相应的JNI映射时遇到了一些困难。 我目前不正确的Java调用如下: public native ArrayList<ExampleClass> cpp2java();
。
通过JNI创建ArrayList
的正确方法是什么(或者上面的问题是什么)? 应该是jobjectArray
吗?
如果它是用Java编写的(我想使用它的上下文),它将是:
public List<ExampleClass> exampleList = new ArrayList<ExampleClass>();
提前致谢。
首先,ArrayList.add()返回布尔值,您应该使用
CallBooleanMethod
也许有更好的方法,但是根据我的经验,您可以
在Java中创建一个空列表
public List<ExampleClass> exampleList = new ArrayList<ExampleClass>()
通过exampleList作为对cpp的引用,例如:
JNIEXPORT jobject JNICALL cppv2javaAL(JNIEnv *env, jobject jlist) {
...
env->CallBooleanMethod(jlist, java_util_ArrayList_add, J_Obj_Example);
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.