Window上Java通过jni调用C++入门尝鲜

1.起因

最近要和服务端对接一些功能,需要将一些C++开发的功能对接给服务端接入,但是他们服务端开发用的是java,所以才有了这个问题:如何使用Java调用C++?问题的答案就是:使用jni做一层java到C++的数据格式转换,然后用java调用C++。

2.方法

2.0 配置java环境

  • (1) 安装 jdk-8u361-windows-x64.exe
  • (2) 配置环境变量
>> JAVA_HOME=D:\software\Java\jdk1.8.0_361
>> CLASSPATH=.;%JAVA_HOME%\bin;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
  • (3) 添加如下环境变量到path变量中:
>> %JAVA_HOME%\bin
>> %JAVA_HOME%\jre\bin

2.1 环境搭建

这里需要安装两个工具:jdk和mingw
jdk安装成功标准:
(1) java命令正常使用:cmd中输入java,运行
java
(2) javac命令正常使用:cmd中输入javac,运行:
javac
mingw安装成功标志:
(1) gcc正常使用:输入gcc -v
gcc
(2) g++正常使用:输入g++ -v
g++

2.2 写一个java程序:NativeTrait.java

public class NativeTrait {
    public native static int isMarkOK(String filename);

    static {
        System.load("E:/Code/jni/MarkAR/libMarkAR.dll");
    }

    public static void main(String[] args) {
        NativeTrait trait = new NativeTrait();
        String filename = "E:/data/zq/miguqingfeng.jpg";
        int ret = trait.isMarkOK(filename);
        System.out.println(ret);
    }
}

2.3 编译java程序,生成.class文件

>> javac NativeTrait.java

2.4 生成对应头文件:NativeTrait.h

>> javah NativeTrait

2.5 新建NativeTrait.cc实现对应方法

#include "NativeTrait.h"
#include <string>
#include <iostream>

JNIEXPORT jint JNICALL Java_NativeTrait_isMarkOK(JNIEnv *env, jclass obj, jstring path_) {
    std::string path = std::string(env->GetStringUTFChars(path_, 0));
    std::cout << "Input path is: " << path << std::endl;
    return 0;
}

2.6 编译生成dll库

>> g++ -Wl,--add-stdcall-alias -shared -o libMarkAR.dll NativeTrait.cc

2.7 测试效果

>> java NativeTrait

java输出结果

3.参考资料

[1] https://blog.youkuaiyun.com/dashu_java/article/details/119326520
[2] https://blog.youkuaiyun.com/azure_sky_2014/article/details/71915605

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值