JNA调用C++动态库,返回二维数组

这篇具有很好参考价值的文章主要介绍了JNA调用C++动态库,返回二维数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JNA/JNI封装,C++开发交流,  showcode1024

1.下载eclipse创建一个项目,jdk选择1.8的版本,更高的需要配置下

package mydemo;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.LongByReference;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.Pointer;
import com.sun.jna.Memory;


public class Hello {
	
	public interface LgetLib extends Library {
		// 调用linux下面的so文件,注意,这里只要写test就可以了,不要写libtest,也不要加后缀
		LgetLib INSTANCE = (LgetLib) Native.loadLibrary("EasyLog", LgetLib.class);
	
		public int test(Pointer arr, int row, int col);

		public int get2Darr(Pointer pppFloatOut, IntByReference pLine, IntByReference pColumn);
		//public void free2Dppt(int line, int column, Pointer ppFloat);
		}
	

	
	public int test(){            
            
// 传入二维数组            
//            Pointer pointers = new Memory(24);
//            int pointer_size = 8;
//            int int_size = 4;
//            int row = 3;
//            int col = 5;
//            int n = 0;
//            for (int i = 0; i < row; i++) {
//                //分配20字节的内存空间,并且该指针指向这个内存空间的首地址
//                Pointer pointer = new Memory(20);
//                for (int j = 0; j < col; j++) {
//                    pointer.setInt(j * int_size, n);
//                    n += 1;
//                }
//                pointers.setPointer(i * pointer_size, pointer);
//                //这里不要释放内存
                Native.free(Pointer.nativeValue(pointer));
//            }
//            //调用Dll动态链接库内的getArrSum函数
//            System.out.println(LgetLib.INSTANCE.test(pointers, row, col));
//            System.out.println("释放内存之前,pointers地址:"+pointers);
//            Native.free(Pointer.nativeValue(pointers));
//            Pointer.nativeValue(pointers, 0);
		
//传出二维数组
		
		//调用
		PointerByReference ppFloat = new PointerByReference();
		Pointer pppFloat = ppFloat.getPointer();
		IntByReference linePt = new IntByReference();
		IntByReference columnPt = new IntByReference();
		//通过获取二维指针的指针,得到三重指针
		LgetLib.INSTANCE.get2Darr(pppFloat, linePt, columnPt);
		int line = linePt.getValue();
		int column = columnPt.getValue();
		System.out.println("line:"+line+",column:"+column);
		double[][] values = new double[line][column];
		//输出一个3行5列的二维数组,即3个指向一行的指针,因此可获取指针数组;
		// 注意getPointerArray方法必须指明指针数组的数量(此处是line = 3),否则返回的指针数组长度不定,有很多干扰值
		Pointer[] pointers = ppFloat.getValue().getPointerArray(0, line);
		for(int i=0;i<line;i++)
		{
			values[i] = pointers[i].getDoubleArray(0, column);
		}
		for(int i=0;i<line;i++)
		{
			for(int j=0;j<column;j++)
			{
			   System.out.println("values["+i+"]["+j+"]:"+values[i][j]);
			}
			System.out.println();
		}
		//传入PointerByReference的getValue()
		//释放内存
		//LgetLib.INSTANCE.free2Dppt(line, column, ppFloat.getValue());           

			return 0;
		}
	
	

	public static void main(String[] args) {
		Hello ts = new Hello();		
		ts.test();

	}

}

动态库编译后放到system32下,system下是64位的,SysWow64是32位的文章来源地址https://www.toymoban.com/news/detail-802955.html

到了这里,关于JNA调用C++动态库,返回二维数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 报错invalid memory access -- Java调用JNA

    \\\"Invalid memory access\\\"是Java中使用JNA(Java Native Access)调用本地库时可能出现的错误之一。 内存越界 在访问本地内存时,如果超出了允许的范围,就会导致无效的内存访问。这可能是由于传递给本地函数的参数有误,或者在访问返回的数据时发生了错误。 内存释放错误 如果在使

    2024年02月03日
    浏览(42)
  • JAVA JNA 调用C接口的三种方式

    test.c libtest.so 可以看到有test方法 建个普通maven项目 测试 使用Linux上的Java运行 mkdir -p /root/jna cd /root/jna 新建MyNative.java 编译并生成头文件(这里java17没找到javah命令,改用java8的,但注意javac ,javah要使用同一个Java版本的) linux直接编辑实现头文件中的接口: 编译时注意引入j

    2024年02月11日
    浏览(40)
  • Java调用第三方库JNA(C/C++)

    GitHub - java-native-access/jna: Java Native Access  源代码  在Java 中使用C语言库的传统做法是使用JNI编程。但是现在有更好的替代方案,即JNA(Java Native Access);JNA是一个开源的Java框架,是SUN公司推出的调用本地库方法的技术,是建立在经典的JIN基础之上的一个框架,之所以说它是JIN的替

    2024年02月06日
    浏览(41)
  • 爱心代码html或c++调用opengl库两种实现(二维三维动态也可键盘交互)

    最近打火机与公主裙电视剧追疯了!!!谁还没有李峋爱心代码!!快来领!!沉浸式追剧大学生今天午觉没睡怒干爱心代码现有三分资源如下: 效果: 1)、公主两个for循环二维C++控制台输出爱心; 2)、原创C++语言利用openGL库实现三维动态旋转粉色爱心; 以上两者可以在

    2024年02月13日
    浏览(58)
  • Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

    1.首先认识一下NDK。 (1)什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,

    2024年02月11日
    浏览(47)
  • C++通过JNI调用JAVA方法返回ArrayList对象

    运行效果:   JAVA实现: 获取系统已安装应用列表并返回ListString对象 C++ JNI实现:

    2024年02月11日
    浏览(47)
  • 【Java基础教程】(八)面向对象篇 · 第二讲:Java 数组全面解析——动态与静态初始化、二维数组、方法参数传递、排序与转置、对象数组、操作API~

    掌握数组的动态及静态创建方式、使用及特征; 掌握引用类型数据的特征; 掌握数组的排序、转置操作; 数组可以将多个变量进行统一的命名,这样相同类型的元素就可以按照一定的顺序进行组合排列 。在 Java中,数组属于引用类型数据,所以在数组的操作过程中,也一定

    2024年02月13日
    浏览(50)
  • 【Java 动态数据统计图】前后端对接数据格式(Map返回数组格式数据)六(120)

    说明 : 前端使用:vue3.0 ECharts可视化库 前后端对接数据格式:无非就是前端把后端返回的数据处理为自己想要的格式,或者,后端给前端处理好想要的格式; 针对前后端的柱状图,趋势图等数据对接,前端一般需要数组格式; 我们之前返回的数据格式是LIst Map 举例:动态数

    2024年02月11日
    浏览(44)
  • Java Web3J :使用web3j调用自己的智能合约,返回一个内部有数组的对象结构时出现NPE问题

    之前有写过一篇文章Java Web3J :使用web3j调用自己的智能合约的方法(教程),当时只是简单的方法调用,也不涉及到什么复杂的数据类型,入参是long类型,出参是String类型。 遇到这个问题是因为有一个方法,需要通过提案的治理id,查询链上提案数据,这个就需要接收提案

    2024年01月19日
    浏览(62)
  • 动态规划入门之二维数组的动态规划(过河卒)

    P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 过河卒,首先科普一下象棋里面的马的跳跃一步的规则吧(这题真够坑人的,连个规则都不给出,害得我第一次交就全wa)。一张图解释   大家看所有标记为p的点的坐标就是马跳一步和原来的位置。解决

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包