簡體   English   中英

JNI-從C ++向量實例化Java ArrayList

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM