使用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);

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值