是否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);
}