学习下JNI,学习如何通过JNI,让Java调用C++代码以及C++调用Java代码。
这里不再讲解如何下载安装配置JDK,网上有很多很多,这里贴一个,可以参考
http://www.cnblogs.com/ymmt/archive/2012/03/10/2389307.html
关于 Jni 相关的语法,变量什么的,有个大神总结的比较全。可以参考博客:
http://blog.csdn.net/banketree/article/details/40535325
本篇博客是参考这位大神写的,不过他用的是 VC 我这里用的是 VS。
http://blog.csdn.net/mingjava/article/details/180946
什么是JNI,内容摘自百度百科
JNI是Java Native Interface的缩写,它提供了若干的
API
实现了Java和其他语言的通信(主要是
C
&
C++
)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已
编译
语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码
交互
,通常会丧失平台
可移植性
。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证
本地代码
能工作在任何Java
虚拟机
环境下。
简单实现
1.Java代码编写
这里就不开eclipse建新工程了,就写一个java文件演示即可。
(1)新建一个HelloWorld文件夹,然后在文件夹里新建一个 HelloWorld.java 文件,代码如下:
class HelloWorld
{
//native声明,用于生成c/c++代码
public native void sayHelloWorld();
//加载c/c++编译好的库
static
{
System.loadLibrary("HelloWorld");
}
public static void main(String[] args)
{
new HelloWorld().sayHelloWorld();
}
}
(2)编译HelloWorld 在命令行环境下,运行 javac 命令编译 HelloWorld,在同目录生成HelloWorld.class
(3)生成 h 文件 同样在命令行环境下,然后运行javah 命令,在同目录生成 HelloWorld.h 文件.
HelloWorld.h内容如下:
在这个h文件中,你会发现有个 sayHelloWorld 结尾的方法,这个方法就是对应我们上面java代码编写的 sayHelloWorld方法。命名格式
Java_包名_类名_方法名
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: sayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_sayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
最终HelloWorld目录下的文件如下:
2.C++端代码
C++端这边就使用 VS 建一个 dll 工程,来生成 dll 吧,我没有用过VC,用VS 也可以实现,我现在使用的是 VS2013
(1) 使用 VS 新建一个 dll 工程
(1.1)新建一个 Win32 Console Application 工程
(1.2) 选择 dll 工程类型
上面点击 OK 按钮创建完工程后,进入下面的界面,点击 Next 按钮
点击 Next 按钮后进入下面的界面 ,选择 DLL ,然后点击 Finish 完成工程创建
(2)编写 C++ 代码
(2.1) 拷贝HelloWorld.h,jni.h,jni.md.h文件到DLL工程。jni.h 文件位于 JDK 安装目录下的 include 目录中,我的JDK是安装在C盘根目录的。
jni_md.h 位于 include/win32目录下
(2.2)将代码添加到 DLL工程中:
为了快速实现,我们就把上面三个文件直接拷贝到 HelloWorld.cpp 目录即可,拷贝之后再添加到工程中。添加到工程中,可以右键选中 source files 也可以使用快捷键Shift + Alt + A.
(2.3) 编写 HelloWorld.cpp 代码
// HelloWorld.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_sayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello World !");
return;
}
(2.4) 修改 HelloWorld.h 代码
修改 HelloWorld.h 中的 jni.h 引入方式,将 #include <jni.h> 改成 #include "jni.h"
3.生成 HelloWorld.dll 动态链接库
右键选中工程,然后选中 Build 生成 HelloWorld.dll。 Build 成功后会在 工程根目录的 Debug 文件夹中生成 HelloWorld.dll。
3.运行 HelloWorld 实现调用
生成 HelloWorld.dll后将其拷贝到 HelloWorld.java 目录下,然后在命令行下运行 java HelloWorld ,就会打印出 Hello World !,说明调用成功了。
如果你的操作系统是64位,运行上面的命令后会出现一个错误:
Can't load IA 32-bit . dll on a AMD 64-bit platform
这是因为 VS 2013 默认生成的库是32位的,此时就需要修改工程属性了。解决方案参看下面的博文:
按上面的博文修改工程属性后,再次 Build 会在工程根目录出现一个 x64 文件夹,64位版的 DLL 就在debug 文件夹里面。
拷贝这个 DLL 到HelloWorld.java 目录,再运行即可。