使用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);
}
我们可以这样实现:
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);
}
相关文章推荐
- Android使用JNI生成.so文件并调用(使用传统生成.h的方法)
- Android使用JNI生成.so文件并调用(使用CMake的方法)
- Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能
- JNI 使用总结 (JAVA 调用C语言编写的DLL/SO/SL文件)
- android jni方式调用c++代码并在其它app中使用生成的.so文件
- android studio中使用ndk编译.so文件,调用C/C++代码(jni编程)
- JNI中调用第三方提供的so文件
- 使用jni调用ffmpeg.so中的H264解码函数播放文件
- Linux平台使用JNI的例子 Java调用so
- Windows下编译使用Android NDK,调用SO文件
- 独立使用UEditor编辑器图片和文件上传(调用内置第三方插件swfupload)
- 利用IDEA进行JNI开发:使用NDK生成Linux平台下的so文件
- jni-使用c代码调用java文件
- 关于android进行jni调用时.so文件的兼容问题
- cocos2d-x使用第三方的so库文件
- [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so
- linux下java调用.so文件的方法1: JNI
- 如何在Android NDK中调用第三方库文件(.so)
- JNI 编写动态链接库 HelloNative 详细过程(也即用Java和C在Linux下动态生成并使用so文件过程)