Я пытаюсь создать ArrayList
, который содержит класс Java, вызывая его методы с помощью встроенной функции. Java класс ExampleClass
выглядит так:JNI - запускать Java ArrayList из C++ Vector
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();
.
Каков правильный способ создания ArrayList
через JNI (или что не так с вышеуказанным)? Должно ли это быть jobjectArray
?
Если она была написана на Java (контекст, я хотел бы использовать его) было бы:
public List<ExampleClass> exampleList = new ArrayList<ExampleClass>();
Спасибо заранее.
Спасибо за ввод. Как вы назовете 'cppv2javaAL' в Java? ('public native ...? ... cppv2javaAL (exampleList);' – Austin
yes, просто создайте собственный Java-метод, который отображает cppv2javaAL – huluyige
Как в мире вы объявляете ** java_util_ArrayList ** в JNI? –