Android Studio-NDK开发(二)调用ndk开发生成的so和jar包

Android Studio-NDK开发(二)调用ndk开发生成的so和jar包


版本说明

版本 作者 日期 备注
0.1 loon 2020.9.1 初稿

目录

文章目录

    • Android Studio-NDK开发(二)调用ndk开发生成的so和jar包
    • 版本说明
    • 目录
      • 1、拷贝so
      • 2、拷贝jar包并导入
      • 3、添加路径到编译脚本中
      • 4、最后

基本上分三步:

  • 1、拷贝so;
  • 2、拷贝jar包并导入;
  • 3、添加路径;

1、拷贝so

由于要适应不同abi对应的系统,所以最好在编译时设置好so的abi类型,一般我们设置的avd为x86或者x86_64,真机一般是armv64或者armv7的。

我习惯还是直接拷贝到模块根目录的libs文件夹下面:

Android Studio-NDK开发(二)调用ndk开发生成的so和jar包_第1张图片

2、拷贝jar包并导入

我这里默认还是放在libs下面,然后右键—>Add As Library:

Android Studio-NDK开发(二)调用ndk开发生成的so和jar包_第2张图片

等到添加成功后,可以看到对应的Java接口:

Android Studio-NDK开发(二)调用ndk开发生成的so和jar包_第3张图片

3、添加路径到编译脚本中

这个一般是常见的问题,我们上面添加完jar包和so之后其实已经可以编译了,而且编译时没有上报任何错误,但是运行时常常会闪退或者在调用对应so中的接口后会app闪退,查看logcat会发现未找到对应的库(couldn’t find “libkysdk.so”):

在这里插入图片描述
我这是因为我们添加库的路径不是标准路径,所以我们需要知名库的路径(当然也有可能是其它原因,但这个原因很常见):

在你运行的模块(比如我这里是app模块)的build.gradle里面配置(android节点下,与buildTypes并列)

sourceSets{
    main{
        jniLibs.srcDirs=['libs']
    }
}

如下图所示:

Android Studio-NDK开发(二)调用ndk开发生成的so和jar包_第4张图片

之后再重新运行就没问题了:

Android Studio-NDK开发(二)调用ndk开发生成的so和jar包_第5张图片

4、最后

ok,成功打通了生成so、jar以及调用的通路。

由于java传递给c/c++的参数比较多,所以我们打算使用类来传递参数,然后在c++侧使用结构体获取数据,这样native接口不会因为参数个数变化而变化,参数个数由于业务变化后我们只需要更改传递的类的属性个数和构造函数即可,下一次我们就来总结一下如何将java的类传递给c/c++层。

你可能感兴趣的:(android开发)