JNI添加外部.so到armeabi目录mk方式

本文介绍如何在JNI目录中通过预构建方式添加一个外部的libaudiowrapper.so文件到armeabi目录。通过创建prebuild目录及prebuild.mk文件,并在Android.mk中引入,实现libaudiowrapper.so的正确集成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jni目录已经存在so文件,想再添加一个外部的libaudiowrapper.so到armeabi目录去,可以这样做:

jni目录下新建prebuild,新建prebuild.mk , 添加libaudiowrapper.so

prebuild.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := audiowrapper
LOCAL_SRC_FILES := libaudiowrapper.so
include $(PREBUILT_SHARED_LIBRARY)

然后在jin目录下的Android.mk最后面加上
include $(LOCAL_PATH)/prebuild/prebuild.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)


LOCAL_C_INCLUDES +=  $(LOCAL_PATH)
LOCAL_C_INCLUDES +=  $(LOCAL_PATH)/mwlog

SRC := $(wildcard $(LOCAL_PATH)/*.cpp)
SRC := $(SRC:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(SRC)

SRC := $(wildcard $(LOCAL_PATH)/mwlog/*.cpp)
SRC := $(SRC:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(SRC)

SRC := $(wildcard $(LOCAL_PATH)/util/*.c*)
SRC := $(SRC:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(SRC)

LOCAL_LDLIBS := -llog
LOCAL_MODULE    := miwalkembedded

include $(BUILD_SHARED_LIBRARY)

include $(LOCAL_PATH)/prebuild/prebuild.mk//这里

这样build就会把libaudiowrapper.so拷贝到armeabi目录下

### 处理64位系统上的 `.so` 文件 在 Android 64位系统中处理 `.so` 文件涉及到几个关键方面,包括库文件的架构支持、加载方式以及常见的兼容性和性能优化问题。 #### 架构支持 对于64位系统的支持意味着应用程序不仅需要提供适用于ARMv8-A (aarch64) 或其他目标平台的`.so`文件版本[^3]。当构建针对不同CPU架构的应用程序时,应确保编译过程中指定了正确的ABI(Application Binary Interface)。这可以通过配置 `build.gradle` 文件中的 `abiFilters` 来实现: ```gradle android { defaultConfig { ndk { abiFilters "armeabi-v7a", "arm64-v8a" } } } ``` 上述代码片段展示了如何设置 Gradle 脚本来仅打包特定 ABI 的共享库[^5]。 #### 正确加载 `.so` 文件 为了使应用程序能够在64位设备上成功加载所需的本地库,在调用 `System.loadLibrary()` 方法时需要注意几点事项。首先,传入的名字应当与 `Android.mk` 或者 `CMakeLists.txt` 中定义的一致,并且不带前缀 `lib` 和扩展名 `.so`。例如,如果模块名称为 `hello-jni`,则应在 Java 层面通过如下语句加载该库: ```java static { System.loadLibrary("hello-jni"); } ``` 其次,考虑到某些情况下可能同时存在多个架构的支持库,建议将这些库放置于不同的子目录下以便区分,如 `src/main/jniLibs/armeabi-v7a`, `src/main/jniLibs/arm64-v8a` 等。 #### 解决常见问题 1. **缺少依赖项**: 如果遇到找不到符号或其他链接错误,则可能是由于缺失必要的动态链接库所引起的。此时可以尝试使用工具链自带的 `ldd` 命令检查是否有未满足的外部依赖关系。 2. **内存访问违规异常**: 当发生此类崩溃时,通常是因为不当操作了堆栈或全局变量的数据结构。务必遵循JNI编程的最佳实践并仔细管理资源生命周期[^2]。 3. **性能瓶颈**: 对于计算密集型任务而言,利用NEON指令集加速浮点运算可能会带来显著的速度提升;而对于I/O密集型场景来说,考虑采用异步IO模型以提高响应速度[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值