JNI应用小例详解

     提到JNI,相信很多人都比较熟悉,在这里我只是简要介绍一下使用经验,做个小结。

    JNI 全名 Java Native Interface,是Java语言的本地编程接口,是J2SDK中,我们可以在%JAVA_HOME%/include中找到<jni.h>. JNI的主要应用是能够提供Java与其他语言(c/c++)的应用接口转换。比如,在C中你定义了一个方法anymehtod(),而在你现在的工程中需要引用这个方法,这时JNI便可以轻松的为你解决这个接口的过度问题。当然,从java到C的调用也一样。下面我们以HelloWord来开始:

1)必要的准备条件

JDK(设置好环境变量),GCC for linux或windows编译器

2)

1.编写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(dll for windows and hello.so for linux)
2.编译java代码

指令
javac HelloWorld.java

 生成HelloWorld.class文件


3.创建.h文件
这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到

指令
javah HelloWorld

这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* 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


4.编写本地实现代码
在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件

内容如下
#include
#include "HelloWorld.h"
#include

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|
的输出了。

 

3)在linux环境下指令如下

1.javac helloworld.java

2.javah helloworld.java

3.gcc -g  -c -fPIC -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux  -o helloworld.o helloworld.cpp

4.g++ -rdynamic -shared -o hello.so helloworld.o 

5. ln -sf  /.../.../hello.so $JAVA_HOME/jre/lib/i386/client

(注意 上面要写so的完整路径)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值