下载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中方法。