android studio引用so库

在工程中编译好的so库文件将在原始编译工程对应目录下:build/intermediates/cxx/Debug/xxxxxx/obj/

其目录结构如上所示,包含生成的四个版本,每个文件夹下均包含c/c++源码编译成的Android版本的libnavi.so库和提供应用接口的libnavi-lib.so库。

后续应用需要将obj下面的文件全部拷贝到需要的工程目录下使用,不是只用到libnavi-lib.so;否则会报错:java.lang.UnsatisfiedLinkError: dlopen failed: library "libnavi.so" not found:

so库的引入步骤:

由于这个是算法层调用,一般将其单独引用在一个module中,往往会新建module,需要注意以下几点,否则会报错。

1、新建的module一般直接采用No Activity,待新建后将上述的文件夹放在该模块src/main下,改名为jniLibs,其结构如下:

直接运行报错:

Execution failed for task ':app:processDebugResources'. > A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction > AAPT2 aapt2-4.2.2-7147631-windows Daemon #0: Unexpected error during link, attempting to stop daemon. This should not happen under normal circumstances, please file an issue if it does.

报这个错误是因为:主工程依赖的子工程不是一个library导致的

apply plugin: 'com.android.application' 改为 apply plugin: 'com.android.library'

<AAPT2 aapt2-4.2.1-7147631-linux Daemon 异常_this should not happen under normal circumstances,-CSDN博客>

2、每个工程只需要一个aplication,新建的module应该是作为主工程依赖的子工程的,需要设置其为library,同时要删除其applicationId,否则会报错。

3、子工程的引入

需要在主工程的build.gradle里的dependencies引入子工程,

implementationproject(':navigation')

4、在子工程中申明引用c/c++源码功能函数接口

首先调用so库

static{

System.loadLibrary ("navi-lib");//这里的`navi`是你的`.so`文件的名称,不包含前缀`lib`和后缀`.so`

}

然后申明调用接口函数

public native String helloworld();

类似采用native依次将需要调用的函数引用进来,便于后续使用。

相关推荐
PangPiLoLo6 分钟前
架构学习——互联网常用架构模板
java·学习·微服务·云原生·架构·系统架构·nosql
!!!5257 分钟前
SpringBoot-web入门程序剖析
java·spring boot·后端
叶羽西17 分钟前
Android GSI (Generic System Image)
android
泷羽Sec-pp33 分钟前
基于Centos 7系统的安全加固方案
java·服务器·前端
CHANG_THE_WORLD1 小时前
Linux 基础 6.进程
java·linux·运维
程序员谷美1 小时前
Redis 性能优化:利用 MGET 和 Pipeline 提升效率
java·redis·性能优化
兴趣使然_1 小时前
[QCustomPlot] 交互示例 Interaction Example
android·交互
Heavydrink1 小时前
JSP内置对象、Servlet与MVC
java·servlet·mvc
Lucky_Turtle2 小时前
【SpringSecurity】二、自定义页面前后端分离
java
雨 子2 小时前
SpringBoot环境和Maven配置
java·spring boot·后端·java-ee·maven