Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。
- 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的
- 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的
- 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们
在《java核心技术》中,作者提到JNI的时候,建议不到万不得已不要使用JNI技术,一方面它需要你掌握更多的知识才可以驾驭,一方面使用了JNI你的程序就会丧失可移植性。
下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。
- 编写java代码
我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示
class HelloWorld
{
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so)
- 编译java代码
javac HelloWorld.java 生成HelloWorld.class文件
- 创建.h文件
这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行
javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下
在此我们不对他进行太多的解释。
/* 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: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
- 编写本地实现代码
在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。
- 运行java程序
把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world|
的输出了。
JNI是一门复杂,有趣且富有挑战性的技术,我们在后面的几篇文章中将说明如何在java语言和Native语言之间进行交互。
分享到:
相关推荐
在android 2.0环境下编写的jni示例项目源码,实现了简单的四则运算
jni示例,简单的建立调用以及dll动态函数库的制作过程,适合jni入门参考,没有任何jni基础的人。
NULL 博文链接:https://jxjjhz.iteye.com/blog/1061489
通过本示例的学习,初学者可轻松掌握android jni的调用流程
两个JNI的示例实现的代码,主要实现了一个没有参数没有返回值的native方法和有参数且有返回值的native方法
JNI示例代码
jni示例vs2005 c++实现,有c++项目源文件,供大家参照,在java目录中直接运行,java TestJni 出效果!
非常简单的调用jni的示例程序,适合初学jni的,不懂的可以留言
本Android示例是java调用c语言的JNI实现,有关具体实现的细节请参见博文http://blog.csdn.net/l1028386804/article/details/47405683
jni程序开发简单示例和说明(eclipse + Microsoft Visual Studio 2010),包括eclipse工程代码和visual studio2010工程代码,和doc说明文件
很好很实用的jni示例程序。很有针对性,接口参数可以传递java class object.
Java中使用Jni简单示例过程.doc
coco2dx JNI示例,java c++相互调用
查了很多资料 好多都能用 所以楼主写了一个 方便新手学习啊
与http://blog.csdn.net/xsz_1025/article/details/52461668配套的代码示例
1.) 在项目根目录下创建jni目录,下面是要放进去的第一个文件Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main_jni #LOCAL_CFLAGS := LOCAL_SRC_FILES := main.cpp #LOCAL_...
该资源抱哈了一个用java实现的jni的基本实例,可以运行,包含了其中的cpp文件,简单易懂,喜欢的下载!
一个简单的OpenGL ES 3.0 示例 (Android NDK jni)
jni动态加载方式示例
http://blog.csdn.net/venusic/article/details/52187452