NDK~快速上手APP本地方法调用

NDK~快速上手APP本地方法调用_第1张图片

 

最近有一个项目,因为新增一个需求,需要调用本地库方法,小编就将加入JNI调用的过程简单和各位分享下吧!

NDK开发小编之前也接触的不多,遂开始查阅资料,添加native支持的方法有很多:

  • AS新建Android项目,选择Native C++,则会创建包含所有Java层和Native支持;

  • 更改模块build.gradle文件,加入externalNativeBuild编译项,指定native编译CMake文件,在项目编译过程中,会自动编译so文件;

  • 现有APP源码下,自定义Android.mk文件,使用NDK编译工具生成so文件,将其导入项目中引用。

Tips:有常用其他的添加native支持方法,欢迎关注公众号留言,谢谢!

小编选择了第三种方式进行开发,和我一起来看看吧!

·  正  ·  文  ·  来  ·  啦  ·

>>>>

Java本地函数定义

 

上层应用进行本地方法调用时,是通过Java声明的native函数进行JNI调用的,那么第一步就是需要声明Java本地函数。

//LocalLibUtilpublic 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.hJNIEXPORT jint JNICALL Java_com_stone_nativedemo_LocalLibUtil_startDownload  (JNIEnv *, jobject);

增加Java native方法调用验证。

Log.d(TAG, "startDownload result is " + LocalLibUtil.startDownload());

>>>>

增加jni实现与本地方法库调用

 

添加完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库

 

在编译jni库之前,首先需要配置NDK工具。执行步骤:

AS->File->Settings-Tools->External Tools->Add//配置参数Program: D:\android-ndk-r10\ndk-build.cmdArguments: APP_ABI="all" NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs Working directory: $ModuleFileDir$\src\main\

NDK~快速上手APP本地方法调用_第2张图片

 

配置好工具之后,开始定义Android.mk编译文件:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := dataprocessLOCAL_SRC_FILES := LocalLibUtil.cppAPP_ABI := allinclude $(BUILD_SHARED_LIBRARY)

接下来开始编译so文件,鼠标选中本地方法所在目录(如CPP目录)

AS->Tools->External Tools->NDK

NDK~快速上手APP本地方法调用_第3张图片

 

等待编译执行结束后,so文件生成成功。

注意:此处需要注意NDK工具配置的Arguments一定要加上APP_ABI=‘all’,否则会丢失部分CPU平台的so库生成文件,在使用这类CPU的机器上运行会因为找不到so库文件而Crash。

>>>>

模块build.gradle配置

 

现在万事俱备,只欠东风了,将生成的so库拷贝到lib目录下,开始配置build.gradle文件。

//引用so模块defaultConfig {    ...    ndk {        moduleName 'dataprocess'    }    ...}//集成libs目录下的so库sourceSets {    main{        jniLibs.srcDirs = ['libs']    }}//指定生成APK支持的CPU平台,针对不同平台生成不同APKsplits {    abi {        enable true        reset()        include 'x86', 'armeabi-v7a', 'x86_64', 'armeabi', 'arm64-v8a','mips','mips64'        universalApk true    }}

 

最后一步,编译APK,安装并运行。

//运行结果startDownload result is 200

本文简单介绍了使用NDK进行APP开发,文中如有错误请公众号留言指正,谢谢。

易飞澈信息科技

更多科技资讯,新技术学习

你可能感兴趣的:(技术分享,Android,NDK开发)