本文运行环境:
开发工具:
1)Java:STS(Spring 优化过的 eclipse)
2)C++:Microsoft Visual Studio 2010 Ultimate(VS 2010 旗舰版)
JDK 环境:JDK 1.8.0_144
开发平台:Windows 7 x64
源文件编码字符集:Java 源码文件使用
UTF8
编码,C++源文件使用UTF8
编码
步骤1. 编写 JNI 文件的 Java 源码
使用 STS 创建一个最简单的 Java 工程:JNI_demo
,并创建org.woodwhales.king.JniTest
类 ,该类有类;两个原生的方法getMessage()
和plus()
:
1 | package org.woodwhales.king; |
注意:编写Java源码之前一定要设置文件是UTF-8
编码保存的。
步骤2. 生成 JNI 头文件
编写完成之后,右击项目找到项目根目录对应的资源管理器:
进入项目的bin
目录下,运行 dos 命令窗口,执行如下命令生成 JNI 头文件:
1 | javah -classpath . -jni org.woodwhales.king.JniTest |
命令执行正确,窗口不会提示任何信息,此时当前 bin 目录下会生成一个名为:org_woodwhales_king_JniTest.h
的头文件:
步骤3. 创建动态链接库项目
打开 VS 2010 开发工具,初始化界面如下:
点击左上角的文件
菜单,创建一个项目:
进入向导界面,直接下一步:
选择DLL
动态链接库项目,并勾选空项目:
创建成功后,开发界面视图如下:
此时,右击该项目,进入资源管理器文件目录:
可以看到项目目录下,还有个TestJni
目录,这个目录就是开发目录,外面的其他文件,是VS2010开发工具自动生成的开发环境相关文件:
步骤4. JNI相关头文件准备
将步骤2 中生成的JNI头文件拷贝一份到步骤3项目的开发目录中:
另外需要将在编写Java源文件所使用的JDK中自带的jni.h
和jni_md.h
头文件也拷贝一份到这个开发目录:
步骤5. 创建项目目录结构
将步骤4中的头文件添加到 VS 2010 开发工具视图的头文件目录中:
添加头文件到头文件目录之后,再创建一个C++源文件到源文件目录中:
选择创建cpp
文件,文件名的命名随意写即可:
步骤6. 开发
开发前的问题注意
前面所有步骤顺利完成之后,开始准备开发,但是有三点需要注意:
问题1:JNI 头文件引用设置
将JNI头文件中引用jni.h
的代码修改为双引号引用:
尖括号是引用系统库,引用非系统库使用双引号。
问题2:源文件编码设置
设置MyDLL
源文件的编码格式:双击打开MyDLL.cpp
文件,让光标在编辑区,然后点击右上角文件
菜单,选择高级保存选项
,设置文件编码格式为无签名的UTF-8
,设置完成之后,保存当前空的源文件即可。
VS 2010 默认创建的文件都是
GB2312
编码的,这会在处理字符串的时候带来很多转码的麻烦。
问题3:32/64 位问题
点击编辑区上面的Debug
下拉框,点击配置管理器,设置项目的解决方案生成的是 64位 项目:
新建解决方案:
选择生成x64
的活动解决方案:
最后设置配为:Release
:
后续生成 dll 文件的时候,工具看到中文也会提示这样的信息:
warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。
因此将源码文件设置成 UTF-8 编码是很有必要的。
开发JNI
在MyDLL.cpp
源码中开始引入步骤5中的头文件org_woodwhales_king_JniTest.h
,实现头文件的函数:
1 |
|
源码编写完成后,点击生成
菜单生成解决方案,或按Ctrl+F7
:
如果编码没有问题,则会在控制台输出如下信息:
1 | 1>生成成功。 |
此时再次进入项目根目录,会发现在 x64 目录下的 Release 目录下,生成了 dll 文件:
步骤7. 测试dll文件
在 java 项目根目录下创建一个名称为 lib 的资源文件目录,用于存放步骤6 开发出来的 dll 文件:
将步骤 6开发出来的 dll 文件拷贝一份到这个lib目录下:
将这个 lib 目录设置为 native 依赖库:
由于 lib 已经是资源目录,所以 lib 中的文件都会被编译到项目的 bin 目录,所以指定项目的 bin 目录为 native 依赖库即可:
编写测试代码:
1 | public class Test { |
输出结果:
这里是C++部分编写的字符串,这里是Java 传过来的字符串:my blog -> 个人博客:https://woodwhales.github.io/
7
参考资料:
Java Programming Tutorial - Java Native Interface (JNI)
Java采用JNI调用VC++生成的dll(Java与C++交互)