Как передать и вернуть массив свойств в jni (java до c ++), а также (c ++ до java) - PullRequest
0 голосов
/ 26 февраля 2020

Как передать и вернуть Массив свойств в jni (java в c ++), а также (c ++ в java)

import java.util.*; 


public class Test { 
    public native static Properties[] getStudentDetails();   
    public static void main(String[] args) {
        System.loadLibrary("Sample");
        int a= 10;
        Properties[] records = getStudentDetails();      
        for(Properties record:records){
            System.out.print("\ntype:"+record.getProperty("type"));
            System.out.print("\ttime:"+record.getProperty("time"));
            System.out.print("\tsource:"+record.getProperty("source"));
            System.out.print("\teid:"+record.getProperty("eid"));
            System.out.println("");
        }

    }   
}

это дает мне ошибку

1 Ответ

1 голос
/ 26 февраля 2020

Предполагая, что у вас есть доступ к std::vector<SearchRecord*> searchRecordResult где-то:

extern "C"
JNIEXPORT jobjectArray JNICALL Java_Test_getStudentDetails(JNIEnv *env, jclass cls) {
    // Get Properties class, its constructor and the put method
    jclass cls_Properties = env->FindClass("java/util/Properties");
    jmethodID mid_Properties_ctor = env->GetMethodID(cls_Properties, "<init>", "()V");
    jmethodID mid_Properties_put = env->GetMethodID(cls_Properties, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

    // Construct the key Strings up front
    jstring key_type = env->NewStringUTF("type");
    jstring key_time = env->NewStringUTF("time");
    jstring key_source = env->NewStringUTF("source");
    jstring key_eid = env->NewStringUTF("eid");

    jobjectArray ret = env->NewObjectArray(searchRecordResult.size(), cls_Properties, 0);
    for (int i = 0; i < searchRecordResult.size(); i++) {
        auto result = searchRecordResult[i];
        // Allocate and fill a Properties object, making sure to clean up the value Strings.
        env->PushLocalFrame(5);
        jobject prop = env->NewObject(cls_Properties, mid_Properties_ctor);
        env->CallObjectMethod(prop, mid_Properties_put, key_type, env->NewStringUTF(result->type));
        env->CallObjectMethod(prop, mid_Properties_put, key_time, env->NewStringUTF(result->time));
        env->CallObjectMethod(prop, mid_Properties_put, key_source, env->NewStringUTF(result->source));
        env->CallObjectMethod(prop, mid_Properties_put, key_eid, env->NewStringUTF(result->eid));
        prop = env->PopLocalFrame(prop);
        env->SetObjectArrayElement(ret, i, prop);
    }

    return ret;
}

Ядро l oop просто создает Properties объекты, заполняет их свойства put и назначает их в правый слот в массиве ret.

...