jni传递对象

简介: 【5月更文挑战第4天】

在Java中,我们可以使用JNI(Java Native Interface)来调用本地代码库,例如C或C++。当我们需要在Java和C或C++之间传递对象时,我们需要在C或C++中创建对应的结构体或类来表示这些对象。

以下是一个简单的例子,演示如何通过JNI传递一个Java对象到C++代码。

Java部分:

public class ExampleObject {
    private int number;
    private String text;

    public ExampleObject(int number, String text) {
        this.number = number;
        this.text = text;
    }

    // getter and setter methods
    public int getNumber() { return number; }
    public void setNumber(int number) { this.number = number; }
    public String getText() { return text; }
    public void setText(String text) { this.text = text; }

    // 本地方法声明
    public native void nativeMethod(ExampleObject obj);

    static {
        System.loadLibrary("example"); // 加载名为"example"的本地库
    }

    public static void main(String[] args) {
        ExampleObject obj = new ExampleObject(42, "Hello from Java");
        obj.nativeMethod(obj); // 调用本地方法
    }
}
#include <jni.h> // JNI头文件

JNIEXPORT void JNICALL Java_ExampleObject_nativeMethod(JNIEnv *env, jobject obj, jobject jobj) {
    // 从jobject转换到jclass
    jclass clazz = env->GetObjectClass(jobj);

    // 查找类中的成员变量
    jfieldID numberId = env->GetFieldID(clazz, "number", "I");
    jfieldID textId = env->GetFieldID(clazz, "text", "Ljava/lang/String;");

    // 获取成员变量的值
    jint number = env->GetIntField(jobj, numberId);
    jstring jstr = (jstring)env->GetObjectField(jobj, textId);

    // 将jstring转换为C++字符串
    const char *text = env->GetStringUTFChars(jstr, 0);

    // 输出获取到的值
    printf("Number: %d, Text: %s\n", number, text);

    // 释放jstring占用的资源
    env->ReleaseStringUTFChars(jstr, text);

    // 本地逻辑处理
    // ...
}

在这个例子中,我们首先在Java中创建了一个名为ExampleObject的类,并声明了一个本地方法nativeMethod。然后,我们在C++中实现了Java_ExampleObject_nativeMethod函数,这个函数是通过JNI调用的。我们使用JNI函数来获取对象的成员变量,并处理相应的逻辑。

请注意,JNI代码需要以正确的方式处理JNI引用和JNI类型转换。在实际应用中,你可能需要处理更复杂的数据类型和异常处理。

目录
相关文章
|
10月前
|
Java 测试技术
Java方法引用详解
在Java中,方法引用是一种强大的功能,它允许您在Lambda表达式中引用方法,而不是在表达式中直接定义这些方法。方法引用使代码更加简洁和可读,尤其在函数式编程中非常有用。本文将详细介绍Java中的方法引用,包括引用类方法、引用对象的实例方法、引用类的实例方法和引用构造器。
77 0
|
8天前
|
Java
java方法引用::
java方法引用::
14 3
|
2月前
|
Java API
什么是Java函数式接口?
【4月更文挑战第13天】
23 0
什么是Java函数式接口?
|
10月前
|
缓存 Java
Java方法四种引用
Java方法四种引用
71 0
|
Java
JNI访问属性和方法
NDK连载系列
60 0
|
缓存 安全 Java
JNI之缓存与引用
NDK连载系列
56 0
|
Java C++
JNI全局回调java方法
JNI全局回调java方法
|
Java
Java - 参数传递(传值、传址/引用)
Java - 参数传递(传值、传址/引用)
312 0
Java - 参数传递(传值、传址/引用)
|
Java
AIDL中的传参及in、out、inout
今天开发AIDL,新建一个接口,写了一个函数,结果build的时候报错了 Process 'command 'xxx/aidl'' finished with non-zero exit value 1 经过长时间的尝试终于搞定,期间也回顾了不少知识,一起总结一下。
476 0
|
安全 Java C++
实现一个在JNI中调用Java对象的工具类,从此一行代码就搞定!
我们知道在jni中执行一个java函数需要调用几行代码才行,如 jclass objClass = (*env).GetObjectClass(obj); jmethodID methodID = (*env).GetMethodID(objClass, methodName, methodSig); jobject result = (*env).CallObjectMethod(obj, methodID, ...); 这样使用起来很不方便,尤其当需要大量的调用java函数就会产生大量的上述代码,由此我产生了一个开发封装这些操作的工具类,以便大量简化我们的开发。 作者:Benn
190 0