欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-06 17:06:15
...

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


版本说明

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

目录


基本上分三步:

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

1、拷贝so

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

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

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

2、拷贝jar包并导入

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

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

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

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

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

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

Android Studio-NDK开发(二)调用ndk开发生成的so和jar包
我这是因为我们添加库的路径不是标准路径,所以我们需要知名库的路径(当然也有可能是其它原因,但这个原因很常见):

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

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

如下图所示:

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

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

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

4、最后

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

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