示例2:linux下的例子 — JNI SO
Linux下java通过JNI方法调用so,编写代码的过程与windows下一模一样,只不过编译过程有所区别,尤其注意,要将编好的so文件路径加入java工程或程序的library参数中,否则会提示找不到这个库文件(原理与windows下添加lib directory一样^_^)
注:也可以用eclipse辅助开发,自己做的时候没有这么做:)
1.编辑java文件如下:
public class testso {
static {
System.loadLibrary("testc"); //这里项目显示为:libtestc.so,只需要填实际的名字,
//前后缀可以不填,linux会自动查找libtestc.so
}
public native static int get();
public native static void set(int i);
public static void main(String[] args){
testso t = new testso();
t.set(10);
System.out.println(t.get());
}
}
2.在终端或者用eclipse编译testso.java文件(javac testso.java)生成相应的class文件testso.class
3.同理用javah testso.class文件生成testso.h文件。其中.h文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#ifndef __testso__
#define __testso__
#ifdef __cplusplus
extern "C"
{
#endif
JNIEXPORT jint JNICALL Java_testso_get (JNIEnv *env, jclass);
JNIEXPORT void JNICALL Java_testso_set (JNIEnv *env, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif /* __testso__ */
4.编辑c文件,内容如下:
或者:建一个c工程,注意项目类型为Shared Library.然后建立一个c文件,把test.h文件拷贝到c工程项目下,方便找到!
#include"testso.h"
int i=0;
JNIEXPORT jint JNICALL Java_testso_get (JNIEnv *env, jclass jc){
return i;
}
JNIEXPORT void JNICALL Java_testso_set (JNIEnv *env, jclass jc, jint j){
i=j;
}
5.命令行编译此文件为so格式!
gcc -fPIC -shared -o libtestc.so testc.c
6.在运行testso.java时,要添加好运行环境(其中注意variable不能随便填!):
否则会提示说在java的library.path下找不到你要调用的那个so(libtestc.so)
有三种方法:
法1、命令行:
Shell方式:#set //查看当前所有的环境变量
#export LD_LIBRARY_PATH=你的so文件所在的路径
这种方法只能在当前shell有用,也就说作用是暂时的。
法2、写入linux配置文件:
#vi /etc/profile
在该文件最后加上export LD_LIBRARY_PATH=你的so文件所在的路径
(需要重启后生效?)
法3、在eclipse下,点击run--->在Environment里面点击new新建--->variable填:LD_LIBRARY_PATH ----->value填:so文件所在目录,这里为:/home/alen/workspace/testc/Debug
7.最后运行java文件,显示10!恭喜你,成功了!