JNI便捷开发框架JNA框架之引用传递ByReference(三)

一、背景

上一篇介绍了JNA框架开发的指针参数传递需要借助类Pointer,也给出例子如何使用Pointer。
本编继续就这个话题,引入另一个类ByReference来实现参数的地址传递(指针传递)

二、案例代码

还是上一篇的案例 :JNI便捷开发框架JNA框架之指针参数Pointer(二)

三、ByReference类

com.sun.jna.ptr.ByReference
提供通用的“指向类型的指针”功能,通常在C代码中用于向调用方返回值以及函数结果。
JNI便捷开发框架JNA框架之引用传递ByReference(三)_第1张图片
ByReference提供了很多继承类,类似Pointer的指针属性,每种数据类型都对应子类供使用
比如int的用IntByReference,字符串的使用PointerByReference。

四、应用

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;

/**
 * 一个java类
 * 演示指针传输指针变量
 */
public class HelloJNA_ByReference {

    /**
     * 定义一个接口,默认的是继承Library ,如果动态链接库里的函数是以stdcall方式输出的,那么就继承StdCallLibrary
     * 这个接口对应一个动态链接(SO)文件
     */
    public interface LibraryAdd extends Library {

        LibraryAdd LIBRARY_ADD = Native.load("/program/cpp/libhello.so", LibraryAdd.class);

        /**
         * 指针变量,用IntByReference【整型】,PointerByReference【字符串指针】类型定义
         * c是int*
         * msg是char*
         */
        int add_c(int a, int b, IntByReference c, PointerByReference msg);

    }

    public static void main(String[] args) {

        IntByReference c = new IntByReference();
        PointerByReference msg = new PointerByReference();
        // 调用so映射的接口函数
        int add = LibraryAdd.LIBRARY_ADD.add_c(10, 15, c, msg);
        System.out.println("相加结果:" + add);

        // 指针变量IntByReference的值需要getValue()
        System.out.println("c的值:" + c.getValue());
        System.out.println("msg的值:" + msg.getValue().getString(0));
    }
}

运行结果:
在这里插入图片描述

五、对比

Pointer和ByReference都可以在JNA项目中用来地址传递参数,Pointer的使用方式更像C/C++的语言结构,自己分配内存空间,自己释放。ByReference则是完完全全的java语法,只要用就行了,内存通过垃圾回收完成。
所以总的来讲ByReference是更好的,但是对于更多层的指针引用,可能Pointer更合适。

上一篇 JNI便捷开发框架JNA框架之指针参数Pointer(二)
下一篇 JNI便捷开发框架JNA框架之结构参数体传递(四)
…开篇 JNI便捷开发框架JNA框架之入门(一)

你可能感兴趣的:(JNI专题,ByReference,java,c++,c语言)