JNI - 从C ++ Vector实例化Java ArrayList

时间:2015-12-24 03:51:59

标签: java android c++ arraylist android-ndk

我试图通过使用本机函数调用其方法来创建包含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>();

提前致谢。

1 个答案:

答案 0 :(得分:1)

首先,ArrayList.add()返回boolean,你应该使用

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);
...
}