android studio引用so库

时间:2024-12-03 16:34:22

在工程中编译好的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,-****博客>

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依次将需要调用的函数引用进来,便于后续使用。