Android Stuido 開發第一個NDK應用

引言:

 不少so庫都是用NDK寫的, 方便作成工具庫
javascript

  1. 準備好Android Studio開發環境, ndk支持
  2. 須要javah命令, ndk-build命令

一, 第一次確保ndk已安裝使用

打開SDK Manager工具, 找到LLDB, NDK 兩個就能夠, 顯示未安裝的就選上確認安裝好,以下圖php

安裝好後,能夠在目錄下找看有沒有ndk文件夾, 或者ndk-bundle文件夾,兩個都同樣,備用
css

進入ndk文件夾, 按下Shift鍵+鼠標右鍵, 選擇 在此處打開命令窗口, 打開CMD窗口,輸入命令ndk-build, 打印結果以下圖是能正確使用的vue

接下來, 設置Android Studio 指定 ndk的路徑, 操做File->Project Structure, 設置Android NDK Location爲剛纔的路徑 以下圖java

上面ndk就算配置好了,繼續檢查一下java,輸入命令javah, 輸出以下圖是正常的, 不是的話,就須要配置javah 環境變量,,,此方法請自行百度
ios

二, 寫一個用於編譯成文件h的Java類

筆者文件名是JNITest.java, 代碼以下c++

public class JNITest {
    static {
        System.loadLibrary("JNITest");
    }

    public native static String getText();
}複製代碼

而後點擊 Build -> Make Project , 將Java文件編譯成class文件,,文件能夠在下圖找有沒有生成的es6

文件路徑好像有點長, 項目路徑下,開始找 app/build/intermediatesweb

沒有classes就有javac,sql

而後, javac/debug/.../classes 找到了,

接下來是com/example/myapplication/jni 相似於應用包名 com.example.myapplication.jni, 包名下有,如圖

能夠打開JNITest.class看看,這個自動生成的,就不貼源碼了,其實這個是能夠用javac命令吧Java文件編譯成class的

三,在繼承Activity類的中類文件修改調用

也就是MainActivity類文件,在onCreate(Bundle savedInstanceState)加上調用上面的代碼

String text = JNITest.getText();
//showAlert(text);
new AlertDialog.Builder(this).setMessage(text).setPositiveButton("OK", null).create().show();複製代碼

後面若是正常,運行app效果圖以下,就是寫的NDK應用是成功的,最後就開始新的征程了...

四, 用javah命令將class文件編譯成h文件

Android Studio中選擇項目文件下的app/src/main文件夾,鼠標右鍵,點擊Open in Terminal, 相似於上面說的,在指定的路徑下打開cmd命令窗口

輸入命令按照格式來 ,以下

javah -d jni -classpath [存放class文件的路徑] [包名.class文件名]

筆者輸入,其中...省略了,太長不顯示:

javah -d jni -classpath D:\...\app\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes com.example.myapplication.jni

執行不出錯的話, 在項目app/src/main目錄下會出現jni文件夾,裏面就有編譯好的com_example_myapplication_jni_JNITest.h文件,打開看文件源碼,以下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_myapplication_jni_JNITest */
#ifndef _Included_com_example_myapplication_jni_JNITest
#define _Included_com_example_myapplication_jni_JNITest
#ifdef __cplusplusextern "C" {
#endif
/* * Class: com_example_myapplication_jni_JNITest * Method: getText * Signature: ()Ljava/lang/String; */
JNIEXPORT jstring JNICALL Java_com_example_myapplication_jni_JNITest_getText (JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif複製代碼

五, 將h文件用ndk工具編譯成so庫

須要建立剩下的三個文件,除了h文件, 在jni目錄下,如圖

第一個文件, test.c, 本身寫,源碼以下

#include <jni.h>
#include <stdio.h>
#include "com_example_myapplication_jni_JNITest.h"
JNIEXPORT jstring JNICALL Java_com_example_myapplication_jni_JNITest_getText (JNIEnv *env, jclass obj){
    return (*env)->NewStringUTF(env, "This is my first NDK Application");
  }複製代碼

第二個文件,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複製代碼

還有,改下項目的app/build.gradle文件, 在部分sourceSets添加jni

sourceSets {
    main {
        java.srcDirs = ['src/main/java', 'src/main/java/lib']
        jniLibs.srcDirs = ['src/main/libs']
        jni.srcDirs = [] //屏蔽掉默認的jni編譯生成過程
    }
}複製代碼


接着,cd 命令進入項目app/src/main/jni目錄, 用ndk-build命令生成so庫文件, 輸出以下結果算是正常的

生成so文件可在項目app/src/main/libs目錄下看到

最後, 項目能夠運行了,,運行過程順利的話, App會彈出一個對話框,這就完成了


參考文獻:

  • 使用Android Studio寫出第一個NDK程序  點這
相關文章
相關標籤/搜索