最近有一个项目,因为新增一个需求,需要调用本地库方法,小编就将加入JNI调用的过程简单和各位分享下吧!
NDK开发小编之前也接触的不多,遂开始查阅资料,添加native支持的方法有很多:
AS新建Android项目,选择Native C++,则会创建包含所有Java层和Native支持;
更改模块build.gradle文件,加入externalNativeBuild编译项,指定native编译CMake文件,在项目编译过程中,会自动编译so文件;
现有APP源码下,自定义Android.mk文件,使用NDK编译工具生成so文件,将其导入项目中引用。
Tips:有常用其他的添加native支持方法,欢迎关注公众号留言,谢谢!
小编选择了第三种方式进行开发,和我一起来看看吧!
· 正 · 文 · 来 · 啦 ·
上层应用进行本地方法调用时,是通过Java声明的native函数进行JNI调用的,那么第一步就是需要声明Java本地函数。
//LocalLibUtil
public static native int startDownload();
声明好函数之后,编译Project,通过编译生成的LocalLibUtil.class文件,使用javah命令,生成对应的jni头文件。
javah -encoding UTF-8 -d ../jni -classpath E:\work\Demo\app\build\intermediates\javac\debug\classes -jni com.stone.nativedemo.LocalLibUtil
//生成头文件结果
//com_stone_nativedemo_LocalLibUtil.h
JNIEXPORT jint JNICALL Java_com_stone_nativedemo_LocalLibUtil_startDownload
(JNIEnv *, jobject);
增加Java native方法调用验证。
Log.d(TAG, "startDownload result is " + LocalLibUtil.startDownload());
添加完Java文件的本地头文件后,需要增加具体的实现类。
//LocalLibUtil.cpp 此文件名可以自定义
#include
#include
#include "com_stone_nativedemo_LocalLibUtil.h"
JNIEXPORT jint JNICALL Java_com_stone_nativedemo_LocalLibUtil_startDownload
(JNIEnv *env, jobject thiz) {
return 200;//Test Code
}
在编译jni库之前,首先需要配置NDK工具。执行步骤:
AS->File->Settings-Tools->External Tools->Add
//配置参数
Program: D:\android-ndk-r10\ndk-build.cmd
Arguments: APP_ABI="all" NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs
Working directory: $ModuleFileDir$\src\main\
配置好工具之后,开始定义Android.mk编译文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := dataprocess
LOCAL_SRC_FILES := LocalLibUtil.cpp
APP_ABI := all
include $(BUILD_SHARED_LIBRARY)
接下来开始编译so文件,鼠标选中本地方法所在目录(如CPP目录)
AS->Tools->External Tools->NDK
等待编译执行结束后,so文件生成成功。
注意:此处需要注意NDK工具配置的Arguments一定要加上APP_ABI=‘all’,否则会丢失部分CPU平台的so库生成文件,在使用这类CPU的机器上运行会因为找不到so库文件而Crash。
现在万事俱备,只欠东风了,将生成的so库拷贝到lib目录下,开始配置build.gradle文件。
//引用so模块
defaultConfig {
...
ndk {
moduleName 'dataprocess'
}
...
}
//集成libs目录下的so库
sourceSets {
main{
jniLibs.srcDirs = ['libs']
}
}
//指定生成APK支持的CPU平台,针对不同平台生成不同APK
splits {
abi {
enable true
reset()
include 'x86', 'armeabi-v7a', 'x86_64', 'armeabi', 'arm64-v8a','mips','mips64'
universalApk true
}
}
最后一步,编译APK,安装并运行。
//运行结果
startDownload result is 200
本文简单介绍了使用NDK进行APP开发,文中如有错误请公众号留言指正,谢谢。
易飞澈信息科技
更多科技资讯,新技术学习