NDk的用处:1,核心代码保护,写入由于apk的Java层代码很容易被反编译,而C/C++库反汇难度较大。
NDK开发常用于-驱动开发、无线热点共享、数学运算、实时渲染的游戏、音视频处理、文件压缩、人脸识别、图片处理等。
JNI java native interface
1、 NDK是一系列工具的集合。
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者帮助时巨大的。
2、NDK提供了一份稳定、功能有限的API头文件声明。这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、log库(liblog)。
配置ndk 环境
1,首先是so文件的生产
创建Native方法
package com.xcm91.relation.ndkapp; /** * Created by lhy on 2017/5/24. */ public class NdkJni { static { System.loadLibrary("native-lib"); } //获取C中隐藏的AppKey public native String getStringFromNative(int x, int y); //native /** * * @param x * @param y * @return */ public static int add(int x, int y) { return x + y; } /** */ public static void callNullMethod() { } /** */ public static void callStringMethod(String str) { } public void helloFromJava() { } }
2,使用android studio自带的Terminal进入cd app/src/main/java 然后执行
javah -d ../jni com.ndkapp.NdkJni
在ndk会自动生成一个.h文件
3,jni目录创建.c文件引用.h文件
#include "com_ndkapp_NdkJni.h" JNIEXPORT jstring JNICALL Java_com_ndkapp_Ndk_getStringFromNative(JNIEnv *env, jobject obj,jint x,jint y) { return env->NewStringUTF("Hello.Jni~!~!") ; }
4,创建Android.mk
#Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) # 库名 LOCAL_MODULE := native-lib # 用到的.c文件 LOCAL_SRC_FILES :=native-lib.c LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)
创建 Applicatio.mk
APP_PLATFORM := android-16 APP_ABI := all
5,用命令到jni文件夹 用命令 ndk-build生成so文件
6, System.loadLibrary("hello"),把so库加载进来(可以调用native本地方法了)
细节
local.properties 设置ndk.dir
目录gradle.properties 添加一行 android.useDeprecatedNdk=true
在当前Module下的build.gradle 文件下的defaultConfig节添加
ndk { abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64" }
检查so文件是否生成