В этом случае все довольно просто.Все, что вам нужно сделать, это передать List
в ваш собственный код и заполнить его внутри JNI
части, используя JNI
методы доступа на основе
#include <vector>
#include "jni.h"
#include "recipeNo046_FillTheList.h"
using namespace std;
JNIEXPORT void JNICALL Java_recipeNo046_FillTheList_fillTheList
(JNIEnv *env, jclass cls, jobject obj) {
vector<int> vect { 1, 2, 3 };
jclass listClass = env->FindClass("java/util/List");
if(listClass == NULL) {
return; // alternatively, throw exception (recipeNo019)
}
jclass integerClass = env->FindClass("java/lang/Integer");
if(integerClass == NULL) {
return; // alternatively, throw exception (recipeNo019)
}
jmethodID addMethodID = env->GetMethodID(listClass, "add", "(Ljava/lang/Object;)Z");
if(addMethodID == NULL) {
return; // - || -
}
jmethodID integerConstructorID = env->GetMethodID(integerClass, "<init>", "(I)V");
if(integerConstructorID == NULL) {
return; // - || -
}
for(int i : vect) {
// Now, we have object created by Integer(i)
jobject integerValue = env->NewObject(integerClass, integerConstructorID, i);
if(integerValue == NULL) {
return;
}
env->CallBooleanMethod(obj, addMethodID, integerValue);
}
env->DeleteLocalRef(listClass);
env->DeleteLocalRef(integerClass);
}
Обратите внимание, что вам не нужно создавать List
объект внутри JNI
, как он у вас уже есть - внутри C++
кода.Передается как аргумент метода native
.
Полный пример кода можно найти здесь:
https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo046
После запуска кода вы можете увидеть данныес C++
передается через объект List
.
> make test
/Library/Java/JavaVirtualMachines/jdk-12.0.1.jdk/Contents/Home/bin/java -Djava.library.path=:./lib -cp target recipeNo046.FillTheList
library: :./lib
1
2
3