linux中jni实现例子:
1.安装gcc: 如果你的linux中已经可以执行gcc命令,那说明已经装好了gcc的,不用再装了
2安装jdk: 我的机子安装的路径 /root/jdk/jdk1.6.0_25
3.创建文件夹: /root/jniTest/com/fs/test
4.在test文件夹中创建java类 HelloJNI.java
代码为
package com.fs.test;
public class HelloJNI
{
static
{
System.loadLibrary("goodluck");
}
public native int get();
public native void set(int i);
public static void main(String[] args)
{
HelloJNI test = new HelloJNI();
test.set(10);
System.out.println(test.get());
}
}
5.终端中进入HelloJNI所在的文件夹test, 编译HelloJNI.java 得到HelloJNI.class
编译命令为: javac HelloJNI.java
6.终端中进入文件夹jniTest, 例上一步生成的.class文件,生成对应的.h头文件
命令为: javah com.fs.test.HelloJNI
命令执行后会在jniTest文件夹中得到com_fs_test_HelloJNI.h文件
7. 在jniTest文件夹中编写HelloJNI.c文件,实现引用第6步中生成的.h头文件,并实现其中声明的方法。
[代码]
#include "com_fs_test_HelloJNI.h"
int i = 0;
JNIEXPORT jint JNICALL Java_com_fs_test_HelloJNI_get(JNIEnv *env, jclass jc)
{
return i;
}
JNIEXPORT void JNICALL Java_com_fs_test_HelloJNI_set(JNIEnv *env, jclass jc, jint j)
{
i= j;
}
8.将第7步中编写的HelloJNI.c文件,编译成.o文件。即从终端进入jniTest文件夹,使用下面的命令
gcc -fPIC -D_REENTRANT -I /root/jdk/jdk1.6.0_25/include -I /root/jdk/jdk1.6.0_25/include/linux -c HelloJNI.c
命令执行完成后会在jniTest文件夹中生成HelloJNI.o文件
注:
/root/jdk/jdk1.6.0_25/include 是jni.h头文件所在的路径
/root/jdk/jdk1.6.0_25/include/linux 是jni_md.h所在的路径
9. 将第8步中生成的HelloJNI.o文件编译成.so库文件。即从终端进入jniTest文件平,使用下面命令
gcc -shared HelloJNI.o -o libgoodluck.so
执行完成后会在jniTest文件夹中生成libgoodluck.so文件
export LD_LIBRARY_PATH=/root/jniso 然后保存退出
3)重启linux系统,或注册linux系统,重新登陆。
export LD_LIBRARY_PATH=/root/jniso 然后保存退出
3)重启linux系统,或注册linux系统,重新登陆。
ok看到结果为10,说明你成功了。
1.安装gcc: 如果你的linux中已经可以执行gcc命令,那说明已经装好了gcc的,不用再装了
2安装jdk: 我的机子安装的路径 /root/jdk/jdk1.6.0_25
3.创建文件夹: /root/jniTest/com/fs/test
4.在test文件夹中创建java类 HelloJNI.java
代码为
package com.fs.test;
public class HelloJNI
{
static
{
System.loadLibrary("goodluck");
}
public native int get();
public native void set(int i);
public static void main(String[] args)
{
HelloJNI test = new HelloJNI();
test.set(10);
System.out.println(test.get());
}
}
5.终端中进入HelloJNI所在的文件夹test, 编译HelloJNI.java 得到HelloJNI.class
编译命令为: javac HelloJNI.java
6.终端中进入文件夹jniTest, 例上一步生成的.class文件,生成对应的.h头文件
命令为: javah com.fs.test.HelloJNI
命令执行后会在jniTest文件夹中得到com_fs_test_HelloJNI.h文件
7. 在jniTest文件夹中编写HelloJNI.c文件,实现引用第6步中生成的.h头文件,并实现其中声明的方法。
[代码]
#include "com_fs_test_HelloJNI.h"
int i = 0;
JNIEXPORT jint JNICALL Java_com_fs_test_HelloJNI_get(JNIEnv *env, jclass jc)
{
return i;
}
JNIEXPORT void JNICALL Java_com_fs_test_HelloJNI_set(JNIEnv *env, jclass jc, jint j)
{
i= j;
}
8.将第7步中编写的HelloJNI.c文件,编译成.o文件。即从终端进入jniTest文件夹,使用下面的命令
gcc -fPIC -D_REENTRANT -I /root/jdk/jdk1.6.0_25/include -I /root/jdk/jdk1.6.0_25/include/linux -c HelloJNI.c
命令执行完成后会在jniTest文件夹中生成HelloJNI.o文件
注:
/root/jdk/jdk1.6.0_25/include 是jni.h头文件所在的路径
/root/jdk/jdk1.6.0_25/include/linux 是jni_md.h所在的路径
9. 将第8步中生成的HelloJNI.o文件编译成.so库文件。即从终端进入jniTest文件平,使用下面命令
gcc -shared HelloJNI.o -o libgoodluck.so
执行完成后会在jniTest文件夹中生成libgoodluck.so文件
注:
第8步与第9步可以使用一个命令完成,只需要合成一步:
gcc –fPIC –I /root/jdk/jdk1.6.0_25/include -I /root/jdk/jdk1.6.0_25/include/linux –shared –o libgoodluck.so HelloJNI.c
10.将第9步中生成的libgoodluck.so文件拷贝到java的加载库LD_LIBRARY_PATH指向的路径中。
1)创建目录/root/jniso,把libgoodluck.so拷贝到/root/jniso中去。
注:可以是任意文件夹,但是前提是文件夹有“可读可写可执行”权限
2)从终端中通过命令vim /etc/profile 打开profile文件, 然后在文件的最后加上export LD_LIBRARY_PATH=/root/jniso 然后保存退出
3)重启linux系统,或注册linux系统,重新登陆。
注:
上面第10步可以改为以下操作,让路径只在当前用户下生效:
1)创建目录/root/jniso,把libgoodluck.so拷贝到/root/jniso中去。
注:可以是任意文件夹,但是前提是文件夹有“可读可写可执行”权限
2)从终端中通过命令vim /root/.bashrc 打开/root下的隐藏文件".bashrc", 然后在文件的最后加上export LD_LIBRARY_PATH=/root/jniso 然后保存退出
3)重启linux系统,或注册linux系统,重新登陆。
11..终端中进入文件夹jniTest运行HelloJNI.class, 命令为:
java com.fs.test.HelloJNIok看到结果为10,说明你成功了。