java动态调用c++库

前言

最近在做一个通过java程序调用c++动态语言库,在网上百度,谷歌找了诸多例子,还是屡试不爽。经过一番折腾还是披荆斩棘,创出一条道路。希望分享给正在迷茫的朋友们...

使用的环境

spring boot + gradle

JNI介绍

JNI全拼是Java Native Interface,中文意思为Java本地调用。JNI标准是Java平台的一部分,它允许java和其他语言的代码进行交互。JNI开始是为了本地已经编译好的语言,尤其是C和C++而设计的,我们也可以使用JNI和其他语言进行沟通,我们只要调用约定受支持了就可以了。

JNI vs JNA

加载流程

使用jni和jna的区别这里便不再多说。这里我使用的是jna的方式。不多说,直接撸代码,首先在依赖文件中加入相关jar包。

compile group: 'com.sun.jna', name: 'jna', version: '3.0.9'

windows环境

  • 定义好java需要调用的本地方法,即native

    EastmzGame.class

        /*** get game result from third* @return*/public native String getGameResult();
    复制代码
  • 生成.class编译文件

    在类文件的当前目录执行,这里加入了字符,防止乱码。

    javac -encoding utf-8 EastmzGame.java

  • 生成.h头文件

    src.main.java目录下执行 javah -classpath . -jni com.bsmao.task.jni.EastmzGame

  • 再由vc编译工具将.h文件实现并且编译出.dll文件,linux为.so文件。

    .dll文件放入到项目中或者放到e盘中

    我这里是放到了resources下面

  • java中再调用.dll文件
    static {try{String path = ResourceUtils.getURL("classpath:jniLibs/GetData.dll").getPath();System.load(path);//System.load("E:/bsmao/dll/MFCLibrary11.dll"); //e盘的绝对地址}catch (Exception e){e.printStackTrace();}}
复制代码
  • 测试调用结果

    这是经过处理过的数据

linux环境

定义本地方法:

本文是指定路劲读取so文件(和so文件生成的文件路径保持一致)

编译.class 生成.h,.c文件

将上面两个文件传入到linux指定文件夹下

/usr/local/bsmao/lib

编译出so文件 命令:

sudo cc -I /usr/local/bsmao/java/jdk1.8.0_162/include/linux -I /usr/local/bsmao/java/jdk1.8.0_162/include/ -I /usr/local/bsmao/lib/ -fPIC -shared -o libEastmzGame.so com_bsmao_task_jni_EastmzGame.c 
复制代码

生成出so文件

调用方式和windows一样

            EastmzGame eastmzGame = new EastmzGame();byte[] res = eastmzGame.ElevenAgreement();
复制代码

测试结果






如果觉得有帮助,请打赏...(^_^ *** ^_^)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何删除虚拟机上的操作系统、删除新建的虚拟机

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 打开VMware,我安装了三个虚拟系统,要对win98进行删除,从磁盘上删除~~ 2、双击你要删除的系统&#xf…

什么是QoS技术

QoS(Quality of Service)是服务质量的简称。从传统意义上来讲,无非就是传输的带宽、传送的时延、数据的丢包率等,而提高服务质量无非也就是保证传输的带宽,降低传送的时延,降低数据的丢包率以及时延抖动等。…

一套完整的用户增长系统架构

互联网的世界里一切都是为了增长,灵光一现的创新可能会让一个产品成功,但绝不可能长久。 在用户增长的领域里,如何复用一套框架,找到最佳实践的一条路径,再配备一点运气,去实现商业成功是我一直所探索的话题…

编译性语言、解释性语言和脚本语言

什么是编译性语言、解释性语言和脚本语言 计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能值型高级语言编写的程序。  翻译的方式有两种,一个是编译,一个是解释。…

对多租户的理解

一、 多租户定义 多租户定义: 多租户技术或称多重租赁技术,简称SaaS,是一种软件架构技术,是实现如何在多用户环境下(此处的多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用…

查看VMware上虚拟机的 ip 地址

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 开启虚拟机: 2.输入账号密码登陆到虚拟机中 3. 选择 xxx Home 右键---- Open in Terinal 进入命令行页面 ----- 输入命令…

Hibernate之表间关系

ManyToOne 多对一,是最常见的表间关系,对应关系数据库中的外键关系。通常用于建立子实体和其父实体的关联关系 Entity(name "Person") public static class Person {IdGeneratedValueprivate Long id;//Getters and setters are omitted for …

Python大神告诉你,学习Python应该读哪些书!

关注头条号,私信回复资料会有意外惊喜呦………………最后一张照片有资料呦。在传统的Web开发之外的领域,Python开发人员的就业机会越来越多,无论你是初学者还是大神,现在正是投入到Python学习的好时机。一个IBM的博客文章报道了如…

脚本语言

脚本语言(Script language,scripting language,scripting programming language)是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。此命名起源于一个脚本“screenp…

Java Agent

一、什么是 Java Agent ? 笼统地来讲,Java Agent 是一个统称,该功能是 Java 虚拟机提供的一整套后门。通过这套后门可以对虚拟机方方面面进行监控与分析。甚至干预虚拟机的运行。 Java Agent 又叫做 Java 探针,Java Agent 是在 …

JDK 1.8 官网下载地址(linux / windows)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 JDK 1.8 官网下载地址: JDK 1.8 官网下载地址(linuxwindows) 上面连接可以直接点击,连接…

跟着太白老师学python day11 可迭代对象和迭代器

如果对象的属性中有__iter__属性就说明是可迭代的,容器类的数据类型都是可迭代对象 如果对象的属性中既有__iter__属性也有__next__属性,就说明这个对象是迭代器 如何判断一个函数是不是可迭代的,是不是迭代器 方法一 s 123 print(__iter__ …

搅局者奇虎360:特供机背后的周式隐忧

摘要:从未涉足制造,将来也“绝不参与制造”的360,却声称要进军智能手机。从未涉足制造,将来也“绝不参与制造”的360,却声称要进军智能手机。 5月4日晚间,“长达半年的思考”后,奇虎360董事长周…

数据结构基础入门知识

数据结构基础入门知识 ------ 数据结构:理解和练习《异类-不一样的成功启示录》IP/26 192IP/25 128IP/24192.12864 3216 2 1 NTP:时间同步服务器高手都是最仔细的,严谨的 telnet 查看某个端口是否可用,是否是开启状态的要有探索冒险的精神 --…

Linux下安装jdk8步骤详述

见:https://www.cnblogs.com/shihaiming/p/5809553.html 0.下载jdk8 登录网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择对应jdk版本下载。(可在Windows下下载完成后,通过文件夹…

用Kotlin撸一个图片压缩插件-实战篇(三)

简述: 由于个人原因,已经有很长一段时间没有写过文章,有句话是那么说的只要开始就不会太晚,所以我们开始《用Kotlin撸一个图片压缩插件》系列文章最后一篇实战篇。实际上我已经把源码发布到了GitHub,代码很简单。有了前两篇文章的…

后端进阶技术总结

1、SDK与API的区别? SDK是Software Development Kit的缩写,即软件开发工具包。可以把SDK想象成一个虚拟的程序包,在这个程序包中有一份做好的软件功能,这份程序包几乎是全封闭的,通过接口联通外界,相应的接…

最简容器化动手小实践——再战flappybird

《Flappy Bird》是一名越南开发者所开发的游戏,这款游戏的主要内容是帮助一只小鸟穿越水管的层层阻碍,玩家所需要的只是点击屏幕从而调整小鸟的高度。而令这款游戏与众不同的是,这款游戏的难度夸张的惊人,大多数玩家在初次上手之后…

为什么电影电视帧率不取整数?

英文名称:time code时间码概念时间码(time code)是摄像机在记录图像信号的时候,针对每一幅图像记录的唯一的时间编码。一种应用于流的数字信号。该信号为视频中的每个帧都分配一个数字,用以表示小时、分钟、秒钟和帧数…

linux下用rpm 安装jdk

1.下载jdk的rpm安装包,这里以jdk-7u4-linux-i586.rpm为例进行说明 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2. 将jdk-7u4-linux-i586.rpm 移动到合适的安装目录上,安装软件不要在/home路径下&#xf…