此文比较简单,主要记录主要步骤而已。
起因:公司需要将原先客户端的JNI
逻辑搬到java
上,给测试同事搞自动化测试环境。原来在Android
上直接使用.so
文件,现在需要生成.dll
文件,由于没搞过C/C++
,所以,又进坑了!
一、配置环境
第一步,下载Eclipse,安装;下载JDK,安装(不是重点,略过)
第二步,安装cdt插件(在Eclipse开发C/C++,生成dll文件使用)
打开 Eclipse Marketplace
搜索CDT安装,此处图示,我已经安装,在你们电脑上应该是install,点击安装下一步就可以(我公司网非常差,所以安装了3次才成功!!!!)
MinGW下载安装,配置环境
- 下载,解压使用
下载官网:http://www.mingw.org/,由于是外国的网站可能下载的时候有些慢,这里提供网盘分享:http://pan.baidu.com/s/1cIIG7k (该版本适用于windows 32/64系统)
配置环境变量(win10是键值对形式,比较直观)
打开环境变量中的path,在最后面加上
;D:\mingw\bin;
(目录参考)即可
- 下载,解压使用
二、JNI代码编写
第一步,创建一个 java类,包含native接口
package com.rytong.test; public class JNILib { // static { // System.loadLibrary("libMyJniLib"); // } public static native void jniPrint(String str); }
使用javah命令
有两个注意要点:1. java7及以上版本,执行javah目录是src目录;2. java7以下版本,执行javah目录为bin目录(有class文件的目录);3. javah 后面的命令格式为:
D:\eclipse\work\HelloWorld\src>javah com.rytong.test.JNILib
,类名去掉.java后缀,前面补全包名即可。- 执行javah命令生成对应的.h文件
- 执行命令不报错则刷新工程,即可在src目录下找到.h文件
创建C++项目
创建一个C++项目,选择shared libary形式创建
将之前生成的.h投文件copy到src的子包下,补全形参
JNIEXPORT void JNICALL Java_com_rytong_test_JNILib_jniPrint
(JNIEnv *env, jclass jthis, jstring str);编写cpp文件(JNI中的语法,不是重点,忽略)
#include "com_rytong_test_JNILib.h" JNIEXPORT void JNICALL Java_com_rytong_test_JNILib_jniPrint (JNIEnv *env, jclass jthis, jstring str){ jboolean iscopy =false; const char *charData = env->GetStringUTFChars(str, &iscopy); printf("The data from java is:%s",charData); env->ReleaseStringUTFChars(str, charData); }
三、DLL文件生成
项目右键,选择properties,找到如下选项,在linker flags处填入:-Wl,–add-stdcall-alias
编译dll文件:选中项目–> build–>release,会生成一个release文件夹,即可得到编译好的dll文件。
四、DLL文件使用
在调用的过程中有点小插曲,之前的一个项目代码不知道怎么回事,不报错就是执行不成功,没有深究,新换个工程就ok了。
把dll文件放到lib文件夹中(文件存放位置随意,后面步骤能找到即可),在原先的包含native接口的类中加载lib(在其他类中加载也可以)
public class JNILib { static { System.loadLibrary("libMyJniLib"); } public static native void jniPrint(String str); }
加载lib在运行时会找不到dll文件,则需要进行如下配置
调用jni的方法,执行,直接上运行结果图