• 利用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:高级特性》

  • 相关阅读:
    计网:传输层
    计网:网络层
    codeblocks 的安装与初体验
    二叉排序树的建立
    使用颜色空间进行图像分割
    密码学笔记
    Git笔记
    SVM笔记
    GAN笔记——理论与实现
    leetcode(三)
  • 原文地址:https://www.cnblogs.com/zyumeng/p/2746407.html
Copyright © 2020-2023  润新知