使用JNI调用第三方.so文件

是否JNI可以调用C++的动态库,但C++动态库必须是自己写的。现实中,我们常常会使用供应商提供的动态库文件(.dll/.so),通过其提供的接口实现相关业务,如果直接使用JNI调用,恐怕不能实现。在这种情况下怎么办呢?

我们可以这样实现:

1.通过JNI,java调用一个自己写的C++动态库(A.so);

2.通过自己的动态库(A.so)调用第三方的动态库(B.so);

这样可以间接实现java调用第三方的动态库(B.so).

java调用自己的动态库方法可以参考我以前文章,在此介绍一下自己的动态库调用第三方动态库的方法。

我们就在Linux环境下以lame(MP3压缩程序)为例,做个简单的介绍:

・・・

// lame_init
typedef lame_global_flags*(*FuncLameInit)();

// 说明:       ↓              ↓     ↓

//                      返回值          自定义的  参数

// id3tag_init
typedef void(*FuncId3tag)(lame_global_flags *);

// 说明:  ↓      ↓           ↓

//          返回值   自定义的            参数

// lame_set_preset
typedef int(*FuncSetPreset)(lame_global_flags *, int);

 

void test(){

 

    // open the libmp3lame.so

    void * handle = dlopen ("libmp3lame.so", RTLD_LAZY);

 

    // declare the functions

    FuncLameInit lame_init = (FuncLameInit)dlsym (handle, "lame_init");
    FuncId3tag id3tag_init = (FuncId3tag)dlsym (handle, "id3tag_init");
    FuncSetPreset lame_set_preset = (FuncSetPreset)dlsym(handle, "lame_set_preset");

 

    // using

    // set param
    lame_global_flags* gfp = lame_init();
    id3tag_init(gfp);
    lame_set_preset(gfp, nCompressRate);

    ・・・

 

  // close

    dlclose(handle);

}

你可能感兴趣的:(技术)