android studio ndk 開發入門

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++開發還有很長的路要走

相關文章
相關標籤/搜索