由于项目需要用java调用C++的动态库,今天开始学习这个东西,本人Java出身,从来没接触过C++,就今天学习了一点点,此篇中使用到的C++都是最基本的语法。笔者写这个菜鸟,写的不好希望大神们多指点指点,不要吐槽。废话不多说了,我就介绍写JNI调用C++动态库的helloWorld。
开发工具: eclipse 3.7(其它版本也可以) vs2010
实现功能:java调用C++一个控制台程序输出一字符串。
第一步:打开eclipse 创建java project工程TestJni,这个就不用截图了,相信大家都会。
第二步:创建java类JniTest,再创建一个native方法sayCode,并在main方法中调用。
代码如下:
package cn.com.code; public class JniTest { public native void sayCode(); public static void main(String[] args) { new JniTest().sayCode(); } }
第三步:生成C++头文件,这个编写C++代码的时候会用到,先生成放着,生成方法:
找到java代码的编译目录有的是在class目录下有的是在bin下,我的是在E:\H\TestJni\bin下,打开命令行CMD,到该目录下,输入javah cn.com.code.JniTest,回车,
在bin目录下就会生成一个名为cn_com_code_JniTest.h的头文件(javah在jdk下的include目录下,有兴趣的可以了解下), 如下图:
第一步,打开vs2010 文件>>新建>>新建项目>>win32 控制台应用程序,名称为“mycode” 单击【确定】按钮,
如下图:
进入到“设置程序想到”窗口,选择“应用程序设置” 在应用程序类型栏勾选DLL 在附件项目栏选择空项目,单击【完成】按钮如下图:
现在就用到了刚才用javah生成的头文件,现在将java工程 bin目录下的cn_com_code_JniTest.h文件、本机jdk include目录下的jni.h 本机jdk include win32下面的jni_md.h 文件复制到C++工程的目录下,
为什么需要这些文件待会说明。右键vs2010解决方案资源管理器中项目,打开 “在windows管理器中打开文件” 就打开了C++的程序目录,将着三个.h的头文件复制进去 如图:
然后在vs2010解决方案资源管理器右键“头文件”>>添加>现有项,选择刚才复制进来的三个.h文件,如下图:
接下来编写C++代码,在 vs2010解决方案资源管理器右键 “资源文件” >>添加>>新建项>>C++类 单击【添加】按钮,生成C++的类 source.cpp
然后打开cn.com_code_JniTest.h 将 #include <jni.h>改为#include "jni.h", 里面有一个方法:
JNIEXPORT void JNICALL Java_cn_com_code_JniTest_sayCode
(JNIEnv *, jobject);
将这个方法复制到source.cpp中编写代码 如下:
#include"cn_com_code_JniTest.h" #include"iostream" using namespace std; JNIEXPORT void JNICALL Java_cn_com_code_JniTest_sayCode (JNIEnv *, jobject){ cout<<"这是C++输出的一句话"<<endl; }
懂C++的就不用说了 ,,想我是个白纸,还是解释下,上面两个是 头文件,第一个就是java用javah生成的 然后那是命名控件,方法是从JNICALL Java_cn_com_code_JniTest_sayCode复制出来的 必须保持一致,这里就不解释了,想必都理解。
接下来就是生成DLL动态库:
在菜单【生成】中选择生成,然后你就会在C++的本地的目录 D:\documents\visual studio 2010\Projects\mycode\Debug下找到source.dll的文件,
接下来就是最关键的一步,配置环境,将DLL配置到path环境变量中,我的做法是直接将Dubug目录配置到path中,这样的好处是我后面运行就不用配置了 新编写的C++方法就直接可以在eclipse中访问了。
配置的方法我就不上图了,将D:\documents\visual studio 2010\Projects\mycode\Debug 配置到环境变量path中。
现在C++已经搞完了,重新回到eclipse中,添加代码 首先加载动态库,System.LibraryLoad("mycode");这里的source就是dll的名字,不要写.dll后缀
package cn.com.code; public class JniTest { static{ System.loadLibrary("mycode"); } public native void sayCode(); public static void main(String[] args) { new JniTest().sayCode(); } }
到现在位置,代码已经写完了,是不是可以直接跑了,不行如果直接跑就会报错:Exception in thread "main" java.lang.UnsatisfiedLinkError: no source in java.library.path
需要重新启动eclipse 加载一次,再运行java 的main方法:
OK 成功了! 是不是感觉很爽! 现在可以直接改C++代码然后生成一下,在eclipse中就可以直接调用了。
现在我做一下简单解释:
C++里面的方法必须和java一致,就是javah生成的那个
因为这个头文件用到了jni.h 将<>改为“”是因为,在本地搜索的,要不然找不到
在jni.h 中使用到了jni_md.h 所以也加进来了
提示: 添加头文件,最好是右键 头文件>添加现有项
好了 就到这吧 接下来我继续学习。
JAVA使用JNI 调用 C++ DLL 动态连接库从零开始 一
原文:http://www.cnblogs.com/fly-air/p/5119604.html