背景:工作中需提供uos下的双录功能并以动态库so的形式提供,交付以C++可执行程序调用动态库成功执行之后进行交付,但是对方在集成的时候是使用java的jna包调用so文件进行使用的,然后一直调用不到这个库。
各方找原因;这里也总结一下
1、关于传参对应问题
C++的std::string与java的String也是不一致的,因此C++提供出来的接口最好是以C的形式提供,因为各种语言一般都会兼容c的基本类型语法的。因此将std::string 转换为char*类型,而java那么可以使用byte[]进行对接调用。
2、就是C++接口的问题(也真是这次遇到问题的关键)
提供出来的C++接口函数需要以C的形式进行编译,也就是说需要加上extern “C”语句,表示使用C语言语法进行编译,主要也是在C++函数重载导致C++的编译产生的中间文件的函数名是带来后缀的,导致jAVA那边是找不到。
通过Java的jna包调用so文件进行传参(直接上代码)
接口对接
public interface CLibrary extends Library {
// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径。(此处:(Platform.isWindows()?"msvcrt":"c")指本地动态库msvcrt.dll)
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(("/usr/lib/libtest.so"),
CLibrary.class);
// 声明将要调用的so中的方法,可以是多个方法(此处示例调用so动态库libtest.so中的Test01()方法)
void Test01(String str, int num);
}
调用:
public static void main(String[] args) {
String cou = CLibrary.INSTANCE.Test01("hi",123);
System.out.println(cou);
}
C++部分
so链接库方法声明方式:
extern "C" void Test01(char* str, unsigned int num, char* strReturn){
*******************************
*****************
**********
return *****;
}
详情可以查看
https://www.cnblogs.com/alex96/p/11363424.html
最后补充一下在ffmpeg的时候avcodec_decode_video2 崩溃问题处理
需要的av_packet需要时局部变量并且每次都得初始化的,