android studio配置ndk開發

weixin_34308389發表於2019-03-04

網上很多資料都比較舊,我查了一些資料,並且試了一下,總結了一個最簡單的配置ndk開發的方法,步驟如下:

1. 在SDK Tools中勾選安裝CMake、LLDB、NDK
545982-2e560794f098ca55.png
image.png
2. 配置External Tools,省去了自己敲命令

引數講解

    javah   用於生成標頭檔案
    Program:$JDKPath$/bin/javah
    Parameters:-d ../jni -jni $FileClass$
    Working directory:$SourcepathEntry$\..\java
    ndk-build   用於構建so包
    注意:MAC/Linux用ndk-build,沒有.cmd字尾
    Program:D:\adt\sdk\ndk-bundle\ndk-build.cmd
    Parameters:什麼都不用填
    Working directory:$ModuleFileDir$\src\main
545982-299fa0bd40998b2b.png
image.png

我的javah配置是

Program:/usr/bin/javah
Parameters:-d ../jni -jni $FileClass$
Working directory:$SourcepathEntry$/../java
545982-7e00623b51816e5a.png
image.png

我的ndk-build配置是

Program:$ANDROID_HOME/ndk-bundle/ndk-build
Working directory:$ModuleFileDir$/src/main
3. 在工程的local.properties檔案中配置NDK的目錄
ndk.dir=/Users/user/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/user/Library/Android/sdk
4. 建立CMakeLists.txt
#定義cmake支援的最小版本號
cmake_minimum_required(VERSION 3.4.1)


add_library( # 設定生成so庫的檔名稱,例如此處生成的so庫檔名稱應該為:native-lib.so
             native-lib

             # 設定生成的so庫型別,型別只包含兩種:
             # STATIC:靜態庫,為目標檔案的歸檔檔案,在連結其他目標的時候使用
             # SHARED:動態庫,會被動態連結,在執行時被載入
             SHARED

             # 設定原始檔的位置,可以是很多個原始檔,都要新增進來,注意相對位置
             src/main/jni/hello.cpp )

# 從系統裡查詢依賴庫,可新增多個
find_library( # 例如查詢系統中的log庫liblog.so
              log-lib

              # liblog.so庫指定的名稱即為log,如同上面指定生成的libnative-lib.so庫名稱為native-lib一樣
              log )
# 配置目標庫的連結,即相互依賴關係
target_link_libraries( # 目標庫(最終生成的庫)
                       native-lib

                        # 依賴於log庫,一般情況下,如果依賴的是系統中的庫,需要加 ${} 進行引用,
                        # 如果是第三方庫,可以直接引用庫名,例如:
                        # 引用第三方庫libthird.a,引用時直接寫成third;注意,引用時,每一行只能引用一個庫
                       ${log-lib} )

檔案中的native-lib是我生成的so檔案的名字,
src/main/jni/hello.cpp是我實現的native方法所在的類,注意路徑不要寫錯,我的檔案所在路徑是這樣的

545982-f7806d9033e80bab.png
image.png

5. 在模組的build.gradle檔案中新增
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig {
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}
6. 建立native方法
package com.test;
public class NativeHelper  {
    static {
        System.loadLibrary("native-lib");
    }
    public native String stringFromJNI();
 
}
7. 編寫cpp檔案
#include "stdio.h"
#include "jni.h"
#include "string"
extern  "C"
JNIEXPORT jstring JNICALL Java_com_test_NativeHelper_stringFromJNI
        (JNIEnv *env,
jobject jobject1){
    return env->NewStringUTF("hello world from cpp");
}

然後專案就可以執行了


參考連結:https://www.jianshu.com/p/1e14dcc81c3c
參考連結的文章不太詳細,我改了改,寫了上文

相關文章