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();
复制代码

测试结果






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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值