1. 程式人生 > >如何優雅地使用安卓NDK

如何優雅地使用安卓NDK

clean call 右鍵 efault prop 包名 public sources 插件

在Android Studio上使用了一段時間的NDK,感覺官方的插件com.android.tools.build.gradle-experimental還是不夠穩定,存在一定問題,不過谷歌也聲明了這個插件是在實驗性階段。幸好官方在Android Studio上提供了另一種方式使用NDK,這篇博客就講講這種到目前為止我覺得非常贊的方法。

開發環境
基礎的安卓開發環境:Android Studio、SDK、JDK
下載好NDK,自己手動下載或者用SDK工具下載都可以
我使用的版本:Android Studio 1.5.1

配置常用命令
NDK開發比較常用的命令就是生成頭文件、構建so包,在android studio上我們可以先配置好命令,使用起來就很方便了,這是我感覺最贊的地方。

如下圖所示,我添加了三個命令,按加號添加

NDK

其中一個命令的配置詳情如下圖:

javah

命令配置參數:

javah用於生成頭文件
Program:$JDKPath$/bin/javah
Parameters: -encoding UTF-8 -d ../jni -jni $FileClass$
註意:這個命令我加上了-encoding UTF-8指定編碼,你可以改成你工程的編碼。
Working directory: $SourcepathEntry$..\java

ndk-build用於構建so包
Program: 你的NDK目錄\build\ndk-build.cmd
註意:windows用ndk-build.cmd,MAC/Linux用ndk-build

Parameters: 什麽都不用填
Working directory:$ModuleFileDir$\src\main

ndk-build clean清除so包
Program: 你的NDK目錄\build\ndk-build.cmd
註意:windows用ndk-build.cmd,MAC/Linux用ndk-build
Parameters: clean
Working directory:$ModuleFileDir$\src\main

配置完三個命令之後,你就可以在右鍵菜單中找到這幾個命令,可以直接使用。如下圖演示了生成NdkTest類的頭文件

javah

配置工程
讓工程項目使用NDK,需要做一些配置工作

在local.properties文件中填寫使用的NDK目錄:

1
ndk.dir=你的NDK目錄的絕對路徑
在gradle.properties文件中添加如下代碼

1
android.useDeprecatedNdk = true
在module的build.gradle添加如下代碼:

android {

defaultConfig {
    ndk {
        moduleName "NdkTest"//定義NDKlibrary的名字
        //ldLibs "log" 添加log庫,看自己需求
    }
}

//這裏設置目錄,默認就這樣寫就可以了
sourceSets {
    main {
        jni.srcDir "src/main/jni"
        jniLibs.srcDir "src/main/libs"
    }
}

}
Hello word
按上面的步驟全都配置完之後就可以在Android Studio上享受NDK了。
下面寫一個簡單的返回Hello word字符串的程序。

首先在java中聲明一個本地方法,並加載本地庫,如下:

public class NdkTest
{
static {
System.loadLibrary("NdkTest");
}
public static native String getString();
}
生成它的頭文件(自動生成的名字是包名+類名me_majiajie_ndktest_NdkTest.h),並且創建c/c++文件(NdkTest.cpp),如下:

#include "me_majiajie_ndktest_NdkTest.h"

JNIEXPORT jstring JNICALL Java_me_majiajie_ndktest_NdkTest_getString
(JNIEnv *env, jclass jc)
{
return env->NewStringUTF("Hello word !!!");
}
在jni目錄創建一個文件命名為Android.mk,填入以下內容

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := NdkTest
LOCAL_SRC_FILES := NdkTest.cpp
include $(BUILD_SHARED_LIBRARY)
然後在jni目錄創建一個文件命名為Application.mk,填入以下內容

APP_MODULES := NdkTest

APP_ABI := all
註意:Android.mk和Application.mk都是NDK默認的配置文件,關於這兩個文件的詳細介紹可以看官網。

最後生成so包就可以了,記住每次修改C文件都需要重新生成so包:

如何優雅地使用安卓NDK