JNI:Java Native Interface

什么是 JNI

JNI 是 Java Native Interface 的缩写,它提供了若干的 API 实现了 Java 和其他语言的通信(主要是C&C++)。从 Java1.1 开始,JNI 标准成为 java 平台的一部分,它允许 Java 代码和其他语言写的代码进行交互。JNI 一开始是为了本地已编译语言,尤其是 C 和 C++ 而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用 java 与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI 标准至少要保证本地代码能工作在任何 Java 虚拟机环境下。

使用 Eclipse 进行 Java/C++ 的异构编程步骤


新建一个 Java 项目,然后添加一个 class,编写代码如下:

package com.sweetlover.testjni;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Print();
	}

	private native static void Print();
	
	static {
		System.loadLibrary("TestJNI");
	}
}

注意:
1.Java 类名需要和文件名一致,以及这里的几个关键字:static 以及 native,此外我们要加载的动态库名称是 TestJNI,全名为 TestJNI.dll;
2.static 本质上同 C++ 的 static 表示静态加载并且仅有一次,具有记忆与限定作用域(与防止同名污染的功能,该功能在 Java 中自动由 package 以及 class 类名机制区分);
3.native 指示这是一个本地方法,java 层只有本地方法的接口,具体的实现还需要 C++ 或其他语言完成;
4.通常我们用 JNI 是为了提高效率或者使用特定平台、操作系统的 API,这意味着跨平台特性的丧失,以及不可避免地要与内存、指针、线程同步与并发打交道带来的内存风险。

在 src 目录下编译,生成符合 JNI 命名规范的头文件


打开命令窗口,输入编译指令,如果编译失败,那么可能是路径问题,比如 Java 环境变量配置问题:

javah com.sweetlover.testjni.Main
结束后生成了 com_sweetlover_testjni_Main.h 头文件。

编译 dll 并加载到 java 项目的执行路径下

在和 com_sweetlover_testjni_Main.h 头文件所在路径下创建对应的 cpp 文件,编写如下代码:

#include <jni.h>
#include <cstdio>
#include "com_sweetlover_testjni_Main.h"

using namespace std;

JNIEXPORT void JNICALL Java_com_sweetlover_testjni_Main_Print
	(JNIEnv *, jclass)
{
	printf("Hello, world!\n");
}

打开 VS2008 开发人员命令行工具,切换到该目录下,键入如下命令:

cl -I "%java_home%\include" -I "%java_home%\include\win32" -LD com_sweetlover_testjni_Main.cpp -FeTestJNI.dll

其中 -I 表示要 include 的目录,-Fe 后面紧跟要生成的动态库名称,因为我的 Java 代码里面要加载的动态库就是 TestJNI,得到下图则生成成功:


好了,现在把 TestJNI.dll 拷贝到 TestJNI 项目路径下,千万别错:


现在你就可以在 Eclipse 里面运行了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值