Jni 学习之Java调用C++

学习下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 工程

Jni 学习之Java调用C++_第1张图片

(1.2) 选择  dll 工程类型
上面点击 OK 按钮创建完工程后,进入下面的界面,点击 Next 按钮
Jni 学习之Java调用C++_第2张图片

点击 Next 按钮后进入下面的界面 ,选择 DLL ,然后点击 Finish 完成工程创建


(2)编写 C++ 代码
(2.1) 拷贝HelloWorld.hjni.hjni.md.h文件到DLL工程。jni.h  文件位于 JDK 安装目录下的 include 目录中,我的JDK是安装在C盘根目录的。
Jni 学习之Java调用C++_第3张图片
jni_md.h 位于 include/win32目录下


(2.2)将代码添加到 DLL工程中:
为了快速实现,我们就把上面三个文件直接拷贝到 HelloWorld.cpp 目录即可,拷贝之后再添加到工程中。添加到工程中,可以右键选中  source files 也可以使用快捷键Shift + Alt + A.
Jni 学习之Java调用C++_第4张图片Jni 学习之Java调用C++_第5张图片

(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位的,此时就需要修改工程属性了。解决方案参看下面的博文:
http://blog.csdn.net/forsta/article/details/25746301
按上面的博文修改工程属性后,再次 Build 会在工程根目录出现一个  x64 文件夹,64位版的  DLL 就在debug  文件夹里面。
Jni 学习之Java调用C++_第6张图片
拷贝这个  DLL 到HelloWorld.java 目录,再运行即可。

你可能感兴趣的:(java,jni)