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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在JNI层中修改java类对象相关的知识,希望对你有一定的参考价值。

我需要在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

以上是关于如何在JNI层中修改java类对象的主要内容,如果未能解决你的问题,请参考以下文章

实现一个在JNI中调用Java对象的工具类,从此只需一行代码

我的C/C++语言学习进阶之旅转载:实现一个在JNI中调用Java对象的工具类

我的C/C++语言学习进阶之旅转载:实现一个在JNI中调用Java对象的工具类

JNI/NDK开发指南——C/C++访问Java实例变量和静态变量

如何通过JNI将java中的对象的地址赋值给c++指针变量

JNI/NDK开发指南——C/C++访问Java实例变量和静态变量