利用JNI动态链接库实现Java调用Jerasure库

利用JNI动态链接库实现Java调用Jerasure库

Java 与C之间通过JNI传递,实现调用Jerasure库对文件进行编码操作,详细过程记录。

生成so文件主要分为一下几步:

  1. 编写.java文件,其中有声明native方法
  2. javac生成.class文件
  3. javah生成.h文件
  4. 编写.c文件
  5. 编写makefile文件,gcc生成so文件
  6. 将so库文件放到-Djava.library.path目录下
  7. 调用so库文件

1.Linux下用Eclipse新建一个工程,暂命名为ReedSolomon,新建一个Encoder.java的类,内容截图如 1.注意包名的定义,先在工程下的src文件中建立包org.apache.hadoop.reedsolomon.jerasure

 

1

2.javah生成需要的.h文件,这个过程中人为的指定下-classpath最好,这样没有问题,这样找到了class文件,注意所在的路径。不过需要注意的是,需要加入包的名称,否则可能会遇到UnsatisfiedLinkError错误,本人没有尝试不加包的编译情况,如2. 成功产生org_apache_hadoop_reedsolomon_jerasure_Encoder.h文件。

2

3.编写.c文件来调用.h文件并实现其中的方法,include jni.h和上面产生的org_apache_hadoop_reedsolomon_jerasure_Encoder.h文件,如3. (函数是从.h文件拷贝过来的,不过参数一定要加上变量,否则编译会出现问题。例如 JNIEXPORT void JNICALL Java_com_eric_jni_HelloNative_say(JNIEnv * env, jobject job)。)

3

4

在ReedSolomon目录下新建一个文件夹,将org_apache_hadoop_reedsolomon_jerasure_Encoder.h和encoder.c都放到so文件夹中。其中注意.c文件中的传递参数,int型对应的是jint,string型对应的是jstring,具体传递方式如4。其中注意,不需要注释掉的部分,因为ReleaseStringUTFChars已释放,加上的话会出现二次释放报错。

 

4.编写makefile文件,如5,将调用到的Jerasure库文件也放在so目录下。生成so库文件。

5

6

 5.我是新建了一个lib文件夹将so文件放到了其中,然后在Eclipse的工程右键>run as>run configure>(x) Arguments>VM arguments,直接添加 -Djava.library.path=lib。如7.

7

 

6.编写java文件来使用这个库文件。 注意这个加载库文件的操作需要在原来那个Encoder.java中加载,否则会出现UnsatisfiedLinkError错误,图1中static块,在编写native的生成文件时不需要加载,但是在使用的时候需要Encoder.java去加载,然后在Eclipse的VM Argument中指定-Djava.library.path=lib即可,然后编写Main.java文件进行调用,运行结果如8.

8

至此完成利用JNI动态链接库实现Java调用Jerasure库过程。

参考:

http://blog.csdn.net/wlbing0625/article/details/7589551

《JAVA核心技术 II:高级特性》

原文地址:https://www.cnblogs.com/zyumeng/p/2746407.html