现在的位置: 首页 > 综合 > 正文

JNI调用(原创+转载)

2013年10月13日 ⁄ 综合 ⁄ 共 1471字 ⁄ 字号 评论关闭

下面是老公为了帮我解决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,系统重启时仍通过读取该配置文件来设置环境变量。

抱歉!评论已关闭.