Как изменить объект класса Java в слое JNI - PullRequest
0 голосов
/ 16 сентября 2018

Мне нужно изменить / назначить значения объекта класса Java в слое JNI. Я новичок в Java и JNI. Ниже приведены коды, которые я написал.

JNI_Test.java

public class JNI_Test {
    enum Gender {
        MALE,
        FEMALE;
    }

    class StudentDetails {
        int rollNum;
        String studentName;
        Gender gender;
    }

    class Students {
        int studentsCount;
        StudentDetails stDetails;
    }

    public native int getStudentDetails(Students obj);

    static {
        System.loadLibrary("student");
    }
}

В нижнем слое JNI мне нужно присвоить / изменить значение Students obj

JNI_Test.c

#include "JNI_Test.h"

JNIEXPORT jint JNICALL Java_JNI_1Test_getStudentDetails (JNIEnv *env, jobject obj, jobject student)
{
    jint retVal = 0;

    /** Here I need to assign/modify value to the 'jobject student' java object 
        like student.studentsCount = 10; ...*/

    return retVal;
}

Кто-то, пожалуйста, помогите мне, я не знаю, что делать дальше .. Заранее спасибо.

1 Ответ

0 голосов
/ 16 сентября 2018

JNI ужасно сложен. Я бы попробовал использовать JNA, если это вариант. С прямым JNI вы должны сделать что-то вроде этого.

JNIEXPORT jint JNICALL Java_JNI_1Test_getStudentDetails (JNIEnv *env, jobject obj, jobject student)
{
    jint retVal = 0;
    jclass thisClass = (*env)->GetObjectClass(env, obj);
    jfieldID fidStudentCount = (*env)->GetFieldID(env, thisClass, "studentsCount", "I");
    jint number = 10;
    (*env)->SetIntField(env, student, fidStudentCount, number);
    return retVal;
}

С JNI, например, вы должны быть очень осторожны со строками, иначе у вас могут возникнуть утечки памяти. Например, вы должны соединить вызовы GetStringUTFChars с ReleaseStringUTFChars.

См. Также эту ссылку .

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