Как я могу передать Struct из C обратно в Java через JNI - PullRequest
0 голосов
/ 15 мая 2018

У меня есть C struct:

struct MyEntity {

    char *_myEntityType;

};

Я создаю его экземпляр:

struct MyEntity my_C_Entity()
{

    struct MyEntity myEntity;

    myEntity . _myEntityType = strdup("user");

    return myEntity;

}

Я хотел бы получить struct MyEntity my_C_Entity на Java:

Java MyEntity Класс объекта

public class MyEntity {

    private String _myEntityType;

    public String get_myEntityType() {
        return _myEntityType;
    }

    public void set_myEntityType(String _myEntityType) {
        _myEntityType = _myEntityType;
    }
}  

Тогда ...

public class FromCPP {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    public native  MyEntity _main();
}  

Как мне установить MyEntity членов объекта из Struct struct MyEntity в my_C_Entity?

extern "C"
JNIEXPORT jobject JNICALL
Java_myproject_1_FromCPP__1main(JNIEnv *env, jobject instance) {

    // set the values here
}

1 Ответ

0 голосов
/ 15 мая 2018

Это можно сделать примерно так:

jclass ent_clazz = env->FindClass("com/your/package/MyEntity");
if (!ent_clazz) return NULL;

// Get the IDs of the constructor and the _myEntityType field
jmethodID ent_init = env->GetMethodID(ent_clazz, "<init>", "()V");
jfieldID fid = env->GetFieldID(ent_clazz, "_myEntityType", "Ljava/lang/String;");
if (!ent_init || !fid) return NULL;

// Create a Java MyEntity instance
jobject result = env->NewObject(ent_clazz, ent_init);
if (!result || env->ExceptionCheck() != JNI_FALSE) {
    env->ExceptionClear();
    return NULL;
}

// entity is your C MyEntity instance
jstring jstr = env->NewStringUTF(entity._myEntityType);
if (!jstr || env->ExceptionCheck() != JNI_FALSE) {
    env->ExceptionClear();
    return NULL;
}

// Set the String field
env->SetObjectField(result, fid, jstr);

return result;

Если вы добавили в класс Java MyEntity конструктор, который принимает начальное значение для _myEntityType, вы можете создать объект и инициализировать поле за один шаг, что устранит необходимость в GetFieldID и * 1007. *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...