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 工程


(1.2) 选择  dll 工程类型
上面点击 OK 按钮创建完工程后,进入下面的界面,点击 Next 按钮


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


(2)编写 C++ 代码
(2.1) 拷贝HelloWorld.hjni.hjni.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 目录,再运行即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值