android studio ndk 開發入門


ndk 開發沒什么神秘的
ndk 說白了就是一個交叉編譯的工具鏈,用它來生成各個CPU架構下的靜態或動態鏈接庫,linux 下就是 .a 和 .so 文件。
原理就是 java 通過 JNI 和 C、C++ 進行交互, 主要用於有大量計算的CPU密集型任務,如游戲和圖形圖像渲染等。
在安全方面核心代碼也經常打成 .so 文件,一方面是各個平台復用,另一方面是增加逆向破解的難度。
生成 .so 文件后打包到 apk 中的 lib 文件夾下就行了。

最原始的方法,native 代碼寫完后用 ndk 工具生成 .so 文件, 手動打包到 apk 中的 lib 下, 手動簽名,測試成功。

這種自己打包的方式就是太繁瑣了,當然自己寫個腳本或小工具也可以。

 下面看看IDE中怎么做

1 老式方法 手動 build

src/main/jni 下放上你的原文件 Android.mk 和 Application.mk

ndk-build 底層包裝了 gnumake, Android.mk 和 Application.mk 都是配置  makefile 的參數

Android.mk

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM