安卓利用NDK打包so文件

下载NDK
配置NDK环境变量
新建工程开始JNI编写
命令行编译JNI
配置gradle打包到指定目录
导出So文件使用

一、首先下载NDK:
这里写图片描述

下载NDK,此处是我已经下载过后自动配置好路径了,如果没下载过,红色方框会有download ndk ,点击下载即可

这里写图片描述

二、配置NDK
如图在系统环境变量path中添加以下路径:
这里写图片描述

测试配置:打开Android studio ,在整个工程的gradle.properties文件中添加droid.useDeprecatedNdk=true
这里写图片描述
像上图这样输入ndk-build回车,若有上图这样的信息输出,而不是说ndk-build not found,就说明ndk环境已经安装成功了。

三、创建Library Module,创建Jni本地代码并实现功能方法之所以创建Library Module是应为我们不仅要编译出so,同时要导出使用so配套的api,将这些api导出成jar包提供给用户使用,详细见下文。

注意:这里创建的Library Module一定要放在jni目录下,或者这个Library Module直接命名为jni,否则变异的时候会报错,切记。

在nativeif创建两个本地功能的类(先忽略api,这是打包so后使用so的api)

NativeTest 代表一个模块的本地方法类,NativeCalculate代表另一个功能模块的本地方法类,在此以加法功能模块举例
这里写图片描述

build(Rebuild Project)本module,看看是否存在以下目录
这里写图片描述

打开命令行,切换到到你module的src\main目录,
这里写图片描述

执行命令如下

javah -d jni -classpath D:\Android_Tools\SDK\platforms\android-25\android.jar;D:\AndroidStudioProjects\NDK\jni\build\intermedi
ates\classes\debug com.fly.customview.jni.nativeif.NativeCalculate

这里写图片描述

ps:javah是jdk工具,请事先配置好环境变量。-d jni代表输出目录jni;一个android.jar替换成你的sdk下版本路径,记得有“;”后面则是build后生成的本地class路径最后只写类名,不用.class后缀,
回车后会自动生成jni目录,里面包含一个以下划线代替包名点和类名方法名的对应头文件 如下图:
这里写图片描述

新建c文件,用c语言实现add的方法
这里写图片描述

这里写图片描述

四、将JNI代码打包成SO库

在jni目录下新建Application.mk和Android.mk文件。

Application.mk内容如下: 
这里主要是APP_ABI值 armeabi-v7a支持性好,如果多个可疑后面空格继续添加其他平台,输出so也将是多个平台的so。

#APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-16

这里写图片描述

Android.mk内容如下:
1处:代表so到处名称,
2处:是要编译打包的c原文件,多个文件用“\”分开。其他内容照写即可。

# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := FrostyJni
LOCAL_LDFLAGS := -Wl,--build-id
LOCAL_SRC_FILES := com_fly_customview_jni_nativeif_NativeCalculate.c \
                    com_fly_customview_jni_nativeif_NativeTest.c

include $(BUILD_SHARED_LIBRARY)

这里写图片描述

准备好这些后,在终端(命令行)(还是在src\main\)目录下输入”ndk-build” ,即可打包出so(注意打包出来会在你配置的名称前自动加上lib,我们不用管,使用的时候也不要把lib去掉)。此时会在main目录下生成libs和obj目录,我们用libs目录下对应平台的so即可。如图:
这里写图片描述

五、提供对接SO库的api,封装成jar,用户就可以方便的通过我们提供的api调用so中方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值