下面是老公为了帮我解决JNI调用写的一个入门级文档,贴出来与大家分享。版权归http://weibo.com/linyinlong所有
步骤1:写调用端代码(文件名:TestJNI.java)
class TestJNI
{
static
{
System.loadLibrary("testjni");//载入库,testjni函数在其中实现
}
public native void testjni(String str); //声明本地调用
public void test(String input)
{
testjni(input);
}
public static void main(String args[])
{
TestJNI haha = new TestJNI();
String input = "haha------------go into c++!";
haha.test(input);
}
}
步骤二:执行如下命令
javac TestJNI.java,如果没有报错,会生成一个TestJNI.class
javah TestJNI,会生成一个文件TestJNI.h文件
步骤三:
创建文件testjni.c
#include <stdio.h>
#include <TestJNI.h>
JNIEXPORT void JNICALL Java_TestJNI_testjni(Java_文件名_方法名)
(JNIEnv *env, jobject obj,jstring jstr)
{
printf("LinYinLong\n");
}
步骤四:
创建Makefile文件如下:(注意gcc前要有一个tab)
libtestjni.so:testjni.o
gcc -Wall -rdynamic -shared -o libtestjni.so testjni.o
testjni.o:testjni.c TestJNI.h
gcc -Wall -c testjni.c -I./ -I/usr/lib/jvm/java-6-openjdk/include/ -I/usr/lib/jvm/java-6-openjdk/include/linux
(注意:这里的-I是导入头文件的搜索路径,这里主要是为搜索TestJNI.h中的jni.h。不同的系统路径可能不同,可通过locate jni.h查)
步骤五:执行如下命令生成.so文件(先cd切换到Makefile文件所在目录)
make
步骤六:执行程序
在类型初始化前加载本地库,此处注意名称,本地库名应该为libtestjni.so,调用的SO必须在系统属性的 java.libray.path 目录下(默认为/usr/jre/lib/i386)运行时可用-D选项指定,java -Djava.library.path=/root/workspace/lib
这里有两种方法:
java -Djava.library.path=. TestJNI
或
在shell中添加变量,在shell中执行:
export LD_LIBRARY_PATH=. (这里将当前目录添加到“库加载路径”中,LD->Load的意思)
再
java TestJNI
(ok了。。。。)
PS:在终端修改环境变量仅在此shell存在时有效,shell关闭环境变量无效,最好要更改系统环境变量文件。其实在shell中不管怎么改环境变量都没关系,不会像windows那样造成系统崩溃,因为在shell中的修改都是暂时的并没有真正改变系统环境变量文件/etc/profile,系统重启时仍通过读取该配置文件来设置环境变量。