`

JNI使用

阅读更多

1、创建一个java文件(HelloWorld.java)。

class HelloWorld {
 static {
  System.loadLibrary("HelloWorld");
 }
 private native void print(); 
 public static void main(String args[]) {

 


    new HelloWorld().print(); 
 }
 
}

2、使用javac命令编译该java文件,在终端输入"javac HelloWorld.java"。生成HelloWorld.class.

3、使用javah命令生成头文件。在终端输入"javah -jni HelloWorld", 生成HelloWorld.h

4、使用本地方法实现头文件中的方法。

#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv *env, jobject obj)
{
  printf("HelloWorld JNI!/n");
  return;
}

5、用gcc编译生成so文件。

  gcc -shared -I /usr/lib/jvm/java-7-oracle/include/ -I /usr/lib/jvm/java-7-oracle/include/linux/ -I /usr/include HelloWorld.c -o libHelloWorld.so

6、运行。

在终端输入java HelloWorld.

7、这时你会发现出问题了

这时java文件中loadlib时找不到这个so导致的,我们这样来运行:"java -Djava.library.path=.  HelloWorld",通过设置java.library.path来找到这个so。

 

好了,到此为止,一个简单的HelloWorld就完成了。

 

注意:

本机库的装入由调用 System.loadLibrary() 方法的类的类装入器启动 —— 在清单 6 中,就是 UnsatisfiedLinkErrorTest的类装入器。根据使用的类装入器,会搜索不同的位置:

  • 对于由 bootstrap 类装入器装入的类,搜索 sun.boot.library.path
  • 对于由扩展类装入器装入的类,先搜索 java.ext.dirs,然后是 sun.boot.library.path,然后是 java.library.path
  • 对于由系统类装入器装入的类,搜索 sun.boot.library.path,然后是 java.library.path

在清单 6 中,UnsatisfiedLinkErrorTest 类是由系统类装入器装入的。要装入所引用的本机库,这个类装入器先查找sun.boot.library.path,然后查找 java.library.path。因为在两个位置中都没有需要的库,所以类装入器抛出UnsatisfiedLinkageError

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics