java集成调用C++提供的动态库so文件失败

背景:工作中需提供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需要时局部变量并且每次都得初始化的,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值