android java 静态库_Android NDK生成及连接静态库与动态库

对于Android应用开发,大部分情况下我们使用Java就能完整地实现一个应用。但是在某些情况下,我们需要借助C/C++来写JNI本地代码。比如,在使用跨平台的第三方库的时候;为了提升密集计算性能的时候(这种情况下往往还可能会直接使用汇编语言)。因此,这里我将为大家介绍如何给其它开发者创建可供使用的静态库或动态库。而应用开发者如何去连接这些生成的静态库或动态库。由于现在Android Studio已经比较成熟,因此以下描述将基于Android Studio的目录布局。

在Android Studio的一个项目工程下,会有一个app文件夹,这个文件夹主要存放我们编写应用的所有代码以及相关其它资源。如果我们需要写JNI,那么就需要在这个目录下创建jni文件夹。jni文件夹里必须包含Android.mk文件、Application.mk文件以及你所要编译的源文件。下面我们先给出编译生成提供给第三方开发者使用的静态库与动态库的Android.mk文件内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)#编译后生成的模块名,在Java端使用System.loadLibrary加载模块的的时候直接用此名

LOCAL_MODULE :=my_blocks#LOCAL_SRC_FILES用于添加源文件(可以是.c,.cpp,.s等)

LOCAL_SRC_FILES := my_block_test.c

LOCAL_SRC_FILES+= my_blocks_data.c

LOCAL_SRC_FILES+= my_runtime.c#条件预编译,如果当前架构为ARMv7以下的架构,则定义MY_NO_CSWAP这个宏

ifeq ($(TARGET_ARCH_ABI),armeabi)

LOCAL_CFLAGS:= -DMY_NO_CSWAP=1endif#连接系统编译出的静态库

LOCAL_STATIC_LIBRARIES :=cpufeatures

LOCAL_STATIC_LIBRARIES+= ld.gold

LOCAL_LDLIBS:= -llog#用于生成动态库

# include $(BUILD_SHARED_LIBRARY)

# 用于生成静态库

include $(BUILD_STATIC_LIBRARY)

$(callimport-module,cpufeatures)

然后,我们把上述编译脚本中所列出的my_block_test.c、my_blocks_data.c以及my_runtime.c这三个源文件放在jni目录下即可编译。

最后,用Android JNI编译器工具——ndk_build编译完之后就可在生成的obj目录下看到my_blocks.a文件了。在Unix/Linux下,.a表示静态库文件;.so表示动态共享库文件。

下面我们将创建另一个工程,这个工程将构建最终可执行的应用。其Android.mk文件描述如下:

LOCAL_PATH := $(call my-dir)### 以下这段用于预构建我们将要连接的已存在的静态库或动态库 ###

include $(CLEAR_VARS)#我们将连接已编译好的my_blocks模块

LOCAL_MODULE :=my_blocks#填写源文件名的时候,要把静态库或动态库的文件名填写完整。

# $(TARGET_ARCH_ABI)/ 表示将不同架构下的库文件存放到相应架构目录下

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmy_blocks.a#LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmy_blocks.so

# 用于预构建静态库(后面可被连接)

include $(PREBUILT_STATIC_LIBRARY)#用于预构建动态库(后面可被连接)

# include $(PREBUILT_SHARED_LIBRARY)

# 这里要注意的是,对于一次预构建只能预构建动态库,要么是静态库,两者不能共存

### 以下内容用于描述编译当前工程的源代码 ###

include $(CLEAR_VARS)

LOCAL_MODULE:=mytest

LOCAL_SRC_FILES:= test.c

LOCAL_STATIC_LIBRARIES:=cpufeatures

LOCAL_STATIC_LIBRARIES+= ld.gold#连接我们前面声明好的静态库

LOCAL_STATIC_LIBRARIES +=my_blocks#连接我们前面声明好的动态库

# LOCAL_SHARED_LIBRARIES += my_blocks

LOCAL_LDLIBS:= -llog#将此模块构建为动态库

include $(BUILD_SHARED_LIBRARY)

$(callimport-module,cpufeatures)

下面我们来看一下这个工程jni的目录结构内容:

c65161470d92a207e384f40ec5a04b49.png

在arm64-v8a、armeabi等每个架构名目录下,都要包含有我们在第一个工程中生成出来的静态库或动态库文件,并且要与架构名相一致。比如一下是arm64-v8a下的内容:

dd33e3e82fdc865f4c2c738851ae45dc.png

然后,我们需要编辑Application.mk文件,如下所示:

#使用当前NDK编译器所支持的所有处理器架构

APP_ABI :=all#使用LLVM Clang 3.6编译器工具链

NDK_TOOLCHAIN_VERSION=clang3.6

#开启C11标准,外加GNU语法扩展

APP_CFLAGS += -std=gnu11#启用Blocks语法

APP_CFLAGS += -fblocks

最后,我们在Java端只需加载我们当前所要执行的动态库模块即可,不需要关心前一个工程所生成的、用于给当前JNI模块所使用的动态库或静态库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值