2018年10月15日 星期一

在Android studio裡設定NDK

在Android studio裡設定NDK

前言

  最近打算讓C++的引擎支援Android,所以就安裝許久沒用的Android studio,裝完後發現NDK的用法跟我以前的用法差很多,所以想說可以換回以前的"ndk-build.cmd"嗎?答案是可以的,設定的過程不太好記,所以在此做個紀錄。

內容

  在設定NDK的第一步驟是安裝NDK,Android studio本來就有整合,只是預設不會裝。首先打開SDK Manager,如下圖
打開SDK Manager

接著選取安裝NDK,如下圖
安裝NDK

安裝完後請重新開啟Android studio。

  下一個步驟是設定External Tools,這裡會新增兩個工具,一個是javah,另一個是ndk-build。
打開設定,如下圖
打開設定

接著到External Tools新增工具,如下圖
External Tools新增工具

新增"javah",如下圖
新增"javah"
Program的參數
$JDKPath$\bin\javah.exe

Arguments的參數
-classpath "$Classpath$;" -d $ModuleFileDir$\src\main\jni $FileClass$

Working Directory的參數
$ModuleFileDir$\src\main\java\
接著新增ndk-build",如下圖
新增"ndk-build"

Program的參數
C:\Users\hosee\AppData\Local\Android\Sdk\ndk-bundle\ndk-build.cmd

Working Directory的參數
$ModuleFileDir$\src\main\
Program的參數的參數因為沒marcro,所以是個絕對位置,其實就是NDK的安裝位置,如果不要用Android studio裡的NDK,
可以把這裡的位置改掉。
接著設定打開專案結構,如下
打開專案結構

接著設定JDK,使用Android studio裡面的JDK,如下圖
設定JDK
設定的部分到此結束,接著是在專案中使用NDK。

  開一個新專案後,在gradle.properties新增以下
android.useDeprecatedNdk=true

如圖
修改gradle.properties

然後在build.gradle新增以下
ndk {
  moduleName "HelloNDK"
  ldLibs "android"
}
sourceSets.main {
  jni.srcDirs = []
  jniLibs.srcDir "src/main/libs"
}

如圖
修改build.gradle

修改完後,再來是新增jni的資料夾,如下圖
新增jni資料夾

新增後會跳出"New Android Component",直接Finish即可,如下圖
"New Android Component"視窗

  在專案的Activity裡新增以下
    static {
        System.loadLibrary("HelloNDK");
    }

    public static native String nativeHello();

如圖
新增NDK介面

介面加完後,使用"javah"來新增header檔。

  接著在jni資料夾新增source檔,檔案內容如下
#include "string.h"
#include "jni.h"
#include "com_example_hosee_hellondk_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_hosee_hellondk_MainActivity_nativeHello(JNI* pEnv,jclass jObj)
{
  return (pEnv)->NewStringUTF("Hello NDK!");
}

操作如圖
新增source檔

  接著在jni資料夾新增"Android.mk",內容如下
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := HelloNDK
LOCAL_SRC_FILES := com_example_hosee_hellondk_MainActivity.cpp
LOCAL_LDLIBS += -landroid
include $(BUILD_SHARED_LIBRARY)

操作如圖
新增"Android.mk"

  接著在jni資料夾新增"Application.mk",內容如下
APP_PLATFORM := android-15
APP_MODULES := HelloNDK
APP_ABI := all

操作如圖
新增"Application.mk"

  接著使用ndk-build產生so檔,如下圖
使用ndk-build產生so檔

最後在專案的Activity新增以下
TextView tv = (TextView) findViewById(R.id.TestTextView);
tv.setText(nativeHello() );

操作如圖
使用NDK的Function

這裡要注意TextView的ID要先去Layout裡面加完,加完後就可以使用了。


參考資料

超级简单的Android Studio jni 实现(无需命令行)

沒有留言:

張貼留言