Mac之Android Studio開發NDK入門
NDK(Native Development Kit),是用於在 Android 應用中巢狀原生程式碼的工具集,現在 Android 開發最常用的工具就是 Android Studio 了,筆者也是剛剛接觸 NDK 開發,用了一天的時間,踩了很多坑,最終跑通了自己的第一個 NDK 程式,話不多說,現在開始。
第一步:給 Android Studio 配置 NDK:
選擇 SDK Manager
選擇 SDK Tools
勾選 NDK 和一個 LLDB 版本,然後點選 Apply
接下來等待下載安裝即可,下載完成後,右鍵點選工程 -- Open Module Setting -- SDK Location
然後選擇 Android NDK location,點選 Select default NDK,然後點選 OK,就配置好了,然後開始寫程式了
從第二步開始就是相當於屬於 JNI(Java Native Interface | Java 本地介面) 開發的基礎流程,因為 NDK 是基於 JNI 的。
第二步:建立一個 JNITest.java 的一個類:
public class JNITest {
//建立一個 native 方法
public native static String get();
}
注意:如果你建立的 get() 方法是紅色的,並且有這樣的提示:Cannot resolve corresponding JNI function Java_com_example_akon_jnitest_JNITest_get more..
解決辦法:Android Studio --Preferences -- Plugins
搜尋 NDK,然後將 Android NDK Support 後面的勾去掉,點選 OK,然後 Restart。當然,如果你沒有這種情況就不用管。
第三步:建立 C 語言檔案,建立 so 庫
點選 Make Project,生成 JNITest.class 檔案
使用 Project 方式檢視當前專案,在當前目錄下可以看到你的 JNITest.class 檔案
開啟 Android Studio 的 Terminal 到 移動到 app/src/main 目錄下
使用命令建立 .h 的標頭檔案
javah -d jni -classpath F:\workSpace\Android\JNITest\app\build\intermediates\classes\debug (注意這裡有空格分開) com.example.akon.jnitest.JNITest
javah:生成標頭檔案
-d jni:當前目錄下建立一個 jni 資料夾
-classpath .../debug 指定要生成標頭檔案的位元組碼檔案目錄,即我們剛剛的 JNITest.class 的目錄
com.example.akon.jnitest.JNITest 是 JNITest 檔案的包名加上位元組碼檔案的名稱
注意:這個 debug 檔案目錄可能太長,輸入麻煩,我們可以找到 debug 資料夾,右鍵 copy path,複製檔案目錄即可
現在我們可以看到 app/src/main 目錄下有一個 jni 資料夾,裡面有一個 com_example_akon_jnitest_JNITest.h 的標頭檔案,就是我們生成的標頭檔案,標頭檔案命名也是按照包名加位元組碼名的規範,以下劃線連線。
然後在 jni 目錄下建立一個 c/c++ resource 檔案 test.c,要選擇 c 為字尾:
#include<jni.h>
#include<stdio.h>
//匯入我們建立的標頭檔案
#include "com_example_akon_jnitest_JNITest.h"
JNIEXPORT jstring JNICALL Java_com_example_akon_jnitest_JNITest_get
(JNIEnv *env, jclass jclass){
//返回一個字串
return (*env)->NewStringUTF(env,"This is my first NDK Application");
}
下面的這個方法使我們從標頭檔案中複製過來的
然後修改了引數,給了返回值。
然後我們在 jni 目錄下建立兩個 .mk 檔案:
一個 Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)
一個是 Application.mk:
APP_ABI := all
然後我們需要生成 so 庫:
開啟 Terminal,到 app/src/main/jni 目錄下,使用 ndk-build 命令生成 so 庫:
注意:如果提示ndk-build: command not found 請執行以下操作:
1. 啟動終端Terminal
2. 進入當前使用者的home目錄
輸入cd ~
3. 建立.bash_profile
輸入touch .bash_profile
4. 編輯.bash_profile檔案
輸入open -e .bash_profile
#路徑是 你安裝ndk 和 sdk的路徑 ,需要自行調整.
export ANDROID_NDK_ROOT=/Users/lvxiangan/ProgramFiles/AndroidStudio/Sdk/ndk-bundle
export ANDROID_SDK_ROOT=/Users/lvxiangan/ProgramFiles/AndroidStudio/SDK
export PATH=$PATH:$ANDROID_SDK_ROOT
export PATH=$PATH:$ANDROID_NDK_ROOT
可以參考下圖:
5. 儲存檔案,關閉.bash_profile
6. 更新剛配置的環境變數
輸入source .bash_profile 也可以重新開啟一個terminal #此時重新開啟命令列, 當前配置也會生效.
7. 驗證配置是否成功:命令列輸入 ndk-build
接著開啟 app/src/main/libs 就可以看見我們生成的 so 庫了。
為了防止 so 庫相容錯誤,在 gradle.properties 最後一行新增:
android.useDeprecatedNdk=true
為了讓專案能夠找到我們的 so 庫,在 build.gradle 資料夾的 android 下新增:
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //遮蔽掉預設的jni編譯生成過程
}
}
然後我們在 JNITest.java 中動態匯入 so 庫,不需要寫 libJNITest,只用寫 JNITest:
package com.example.akon.jnitest;
public class JNITest {
// 動態匯入 so 庫
static {
System.loadLibrary("JNITest");
}
//建立一個 native 方法
public native static String get();
}
然後我們在 MainActivity 中列印 JNITest 的 get() 方法獲取到的 String 值:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//列印資訊
Log.e("Message",JNITest.get());
}
}
然後執行,檢視日誌,搜尋 Message:
然後我們就檢視到了我們獲取的 String 了,“This is my first NDK Application”,就是我們在 C 語言檔案中所返回的字串。
好了,第一個 NDK 程式就寫完了。
相關文章
- Android -- NDK開發入門Android
- Android Studio ndk-Jni開發詳細入門,Aes加密demoAndroid加密
- android studio配置ndk開發Android
- Android Studio中NDK開發Android
- Android Studio搭建ndk開發流程Android
- Android Studio NDK開發-環境配置Android
- Android Studio NDK開發:自定義庫Android
- Android Studio NDK開發:環境配置Android
- [Android開發]Mac下NDK開發(JNI)AndroidMac
- Android Studio NDK開發-JNI呼叫Java方法AndroidJava
- Android Studio3.0 NDK配置與開發Android
- Android Studio ndk-Jni開發詳解Android
- Android Studio 已有專案新增NDK支援(mac/ndk-build)AndroidMacUI
- Andorid Studio NDK開發-使用NDK庫
- Android Studio NDK開發:JNI呼叫Java函式AndroidJava函式
- Android NDK開發之JNI基礎Android
- Android Studio NDK 入門教程(3)--Java與C++之間的型別簽名AndroidJavaC++型別
- Andorid Studio NDK 開發 – NDK 開發利器 gradle-experimentalGradle
- Andorid Studio NDK 開發 - NDK 開發利器 gradle-experimentalGradle
- Android NDK開發之旅15 NDK Eclipse下NDK開發流程AndroidEclipse
- Android開發入門之熟悉開發環境Android開發環境
- Android Studio NDK 入門教程(1)--來自C 語言的StringAndroid
- Andorid Studio NDK開發-Hello World
- Andorid Studio NDK 開發 - Hello World
- Andorid Studio NDK開發:Experimental PluginPlugin
- Andorid Studio NDK開發:使用庫
- Andorid Studio NDK開發:Hello World
- Ndk 初步開發 In AndroidAndroid
- Android Studio NDK :一、基礎入門(基於gradle-experimental外掛)AndroidGradle
- Android NDK 開發之 CMake 必知必會Android
- Android NDK開發(二) 使用ndk-build構建工具進行NDK開發AndroidUI
- Flutter 快捷開發 Mac Android Studio 篇FlutterMacAndroid
- Andorid Studio NDK開發-LLDB除錯LLDB除錯
- Andorid Studio NDK開發:LLDB除錯LLDB除錯
- Android Studio 入門指南Android
- Android Studio NDK:三、打包SOAndroid
- Android NDK開發之旅29 NDK FFmpeg視訊播放Android
- Android Studio NDK 入門教程(2)--Java與C++之間的簡單資料轉換與傳遞AndroidJavaC++