Android 如何调用第三方.so (.a) 文件

本文介绍了在NDK开发中集成第三方本地库的方法,包括符合JNI接口的库和不符合JNI接口的库。对于符合JNI接口的库,可以直接通过Java层调用;对于不符合JNI接口的库,则需要自行进行编译配置。

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

在ndk开发中,我们有时候会使用到别人编译好的第三方本地库,这些本地类库有时候是符合JNI接口的,同时可能会提供一些Java接口文件,这样我们就可以直接将.so文件和Java文件直接导入。但是有时候,可能一些本地类库并不符合JNI接口,而且,其并没有提供Java层,这个时候,我们就需要自己编译本地类库啦。本文,我们将对这两种情况进行说明。

1. 本地类库符合JNI接口

大多数本地类库都是符合这种情况的,什么叫符合JNI接口呢,就是类库的入口函数名称是按照JNI接口命名的,这种情况下,我们是可以直接从Java层调用该本地类库的。这种类库使用比较简单,一般来说,这种类库都会提供一些Java文件,我们可以通过这些Java文件来调用本地类库。

2. 本地类库不符合JNI接口

有时候,我们在编写本地代码的时候,可能会使用到一些本地类库,来集成一些功能,通常这些类库是不符合JNI接口的,因为它是提供给本地代码使用的,那么我们应该如何使用这些代码呢? 
比如,我们在编写本地类库twolib-second的时候,需要用到twolib-first.a类库(注意,该类库是静态库),我们可以这样使用,jni文件结构, 
这里写图片描述 
其中,first.h是twolib-first.a的头文件。此时需要注意,如果一个类库没有提供头文件,那么我们是无法使用该类库的。 
mk文件

include $(CLEAR_VARS)
LOCAL_MODULE := libtwolib-first
LOCAL_SRC_FILES := libfirst/libtwolib-first.a
LOCAL_EXPORT_C_INCLUDES := libfirst/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libtwolib-second
LOCAL_SRC_FILES := second.c
LOCAL_STATIC_LIBRARIES := libtwolib-first
include $(BUILD_SHARED_LIBRARY)
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

首先,我们prebuilt一下libtwolib-first模块,然后编译我们自己的模块,并制定依赖的库LOCAL_STATIC_LIBRARIES := libtwolib-first。编译成功后,在我们的Java文件,我们只需要loadLibrary(“twolib-second”)就可以了。但是如果我们使用到的类库是共享库(后缀名是.so),那么我们也得将该库load。也就是这样,

        System.loadLibrary("twolib-second");
        System.loadLibrary("twolib-fisrt");
 
  • 1
  • 2
  • 1
  • 2

Demo下载地址,Github

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值