利用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/archive/2012/10/30/2746407.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值