JNI:java调用c语言(codeblocks+mingw64)

java也是可以调用其他语言的(比如c,c++,c#,php之类的),比如说通过webservice技术。

另外,刚刚我折腾了一下JNI(Java Native Interface的缩写),用java调用本地的dll文件(好处,可以借助c调用系统底层函数之类。坏处:不能跨平台了)。


本人环境windows7(64位) jdk7(64位) Eclipse(64位) 。


以前搞c也是用vc6(古老的神器了)。由于各种原因后来也就没怎么搞了。

这次主要是用codeblocks+mingw,途中遇到各种蛋疼问题:


1.首先下载codeblocks和mingw:

codeblocks好说,我下载了个免安装版的。mingw用在线安装也是可以很容易安装。然而codeblocks自带的mingw不能编译出64位的dll。

于是去下载mingw64,问题来了不知道是不是网络问题一直安装不了。

好在搜索好久找到了个离线安装包

mingw64的https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.8.2/threads-posix/seh/x86_64-4.8.2-release-posix-seh-rt_v3-rev4.7z/download

MSYS的http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/ 

下载好后,把他们解压到同一个mingw64文件夹好了。

然后配置



注意了,这个坑爹,他不会扫描子目录,所以子目录也要加上去


2.用Eclipse做个helloworld


public class TestJni {
	static {
		System.loadLibrary("memorycatc");
	}

	public static native void say();

	public static void main(String[] args) {
		TestJni.say();
	}
}
然后选中项目,按alt+shift+w,然后用explorer打开,


先按着shift键再鼠标空白的地方,菜单就会多出【在此处打开命令窗口】


用命令行生成.h头文件。



然后,把刚才生成的TestJni.h的文件内容复制粘贴到main.h里,再然后把main.cpp改成如上图所示。

注意了,函数声明不需要参数名,但函数的实现需要写上参数名。我这里自己加了 env和jo。


随便找个工具,看看导出函数正不正确,Java_Test***类似这样的就可以了,但是如果前面还有一些_Z64什么的符号就不对了。


把刚才生成的dll复制到项目跟路径。然后就是运行测试了:


最后输出结果:


MemoryCat.com says helloworld1


评论
2016-08-28 02:51:07 1
可以,谢谢了
文章信息
作者: admin
目录: java
创建: 2016-02-14
更新: 2016-02-14
如果文章对你有帮助,请博主喝杯咖啡:-)