您的位置:首页 > 其它

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

2009-11-27 13:40 337 查看
是否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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: