java - 如何在JNI层修改java类对象

标签 java android java-native-interface

我需要在 JNI 层更改/分配 java 类对象的值。我是 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;
}

请有人帮助我,我不知道该怎么办了..提前致谢。

最佳答案

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 配对。

另请参阅this link .

关于java - 如何在JNI层修改java类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52350437/

相关文章:

javascript - Phonegap 构建 Android : ReferenceError

java - JNI 不适用于 __stdcall

java - 如何在 jni 输入参数中返回 double[]

android - 如何在移动设备上获得大文件的快速文件哈希算法

java - Hibernate 中 @Embedded 类的聚合

java - 如何与不同类中的swing组件进行交互

java - equals()方法未从文件中检测到单词

java - 是否可以在 Eclipse 的 Java 堆栈跟踪控制台中自动换行?

android - 使用 Android 智能手机检测红外光点

android - ListView 条目中的背景图像自发消失