ndk 开发没什么神秘的
ndk 说白了就是一个交叉编译的工具链,用它来生成各个CPU架构下的静态或动态连接库,linux 下就是 .a 和 .so 文件。
原理就是 java 经过 JNI 和 C、C++ 进行交互, 主要用于有大量计算的CPU密集型任务,如游戏和图形图像渲染等。
在安全方面核心代码也常常打成 .so 文件,一方面是各个平台复用,另外一方面是增长逆向破解的难度。
生成 .so 文件后打包到 apk 中的 lib 文件夹下就好了。java
最原始的方法,native 代码写完后用 ndk 工具生成 .so 文件, 手动打包到 apk 中的 lib 下, 手动签名,测试成功。linux
这种本身打包的方式就是太繁琐了,固然本身写个脚本或小工具也能够。android
下面看看IDE中怎么作macos
1 老式方法 手动 build安全
src/main/jni 下放上你的原文件 Android.mk 和 Application.mk架构
ndk-build 底层包装了 gnumake, Android.mk 和 Application.mk 都是配置 makefile 的参数app
Android.mkide
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello # 生成的静态连接库或动态连接库的名字, linux 下生成 libhello.so LOCAL_SRC_FILES := hello-jni.c # 全部的源文件,空格隔开 include $(BUILD_SHARED_LIBRARY) # 生成动态连接库
Application.mk工具
APP_ABI := all # 生成全部CPU架构下的库,若是没有 Application.mk 默认只会生成 arm 架构下的库
hello-jni.c 没什么说的测试
#include <jni.h> jstring Java_com_example_lesliefang_myapplication_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz) { return (*env)->NewStringUTF(env, "Hello from JNI ! "); }
jni.h 是 jdk 中的头文件,在 jdk 安装目录下,本身有必要看一下
java 层代码,没什么可说的
public class MainActivity extends Activity { TextView textView; static { System.loadLibrary("hello"); } public native String stringFromJNI(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textview1); textView.setText(stringFromJNI()); } }
build.gradle 中添加以下配置
android { sourceSets{ main{ jni.srcDirs = [] // 阻止 gradle 本身生成 Android.mk 文件,由于咱们本身写了 jniLibs.srcDir 'src/main/libs' // 打包时从这里拿 .so 文件 } } }
切换到 src/main/jni 目录下执行 ndk-build 就在 libs 下生成了各个平台的库文件
目录结构是这样的
下面运行就好了, 自动会把你的 .so 文件打包到 apk 中的 lib 文件夹下。
2 Android studio 1.3 后就支持集成 ndk 了,这样就不用手动 build 了, Android.mk 也能够不写了
File->Project Structure 中配上你 ndk 的路径,没有就先下载
这跟直接在 local.properties 写是同样的
ndk.dir=/Users/lesliefang/leslie/android/android-ndk-r10e
sdk.dir=/Users/lesliefang/leslie/android/android-sdk-macosx
build.gradle 中添加一个配置
android { defaultConfig { ndk { moduleName "hello" // 要生成的库文件的名称 } } }
如今目录结构是这样的, Android.mk 和 Application.mk 都不要了
点击运行,自动编译生成.so文件并打包到 apk 中
但如今 android studio 对 C 和 C++ 的调试支持还只是实验阶段 ,下次看一下 gdb 手动调试和 IDE 调试。
JNI 远没有这么简单,要想熟练的用JNI 、C 和 C++开发还有很长的路要走