使用 Android Studio 寫出第一個 NDK 程序

    NDK(Native Development Kit),是用於在 Android 應用中嵌套本地代碼的工具集,現在 Android 開發最常用的工具就是 Android Studio 了,筆者也是剛剛接觸 NDK 開發,用了一天的時間,踩了很多坑,最終跑通了自己的第一個 NDK 程序,話不多說,現在開始。

第一步:給 Android Studio 配置 NDK:

    選擇 SDK Manager

    選擇 SDK Tools

    勾選 NDK 和一個 LLDB 版本,然後點擊 Apply

 

    接下來等待下載安裝即可,下載完成後,打開 File -- Project Structure -- 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..

    解決辦法:File -- Settings -- Plugins 

    搜索 NDK,然後將 Android NDK Support 後面的勾去掉,點擊 OK,然後 Restart

    當然,如果你沒有這種情況就不用管。

第三步:創建 C 語言文件,創建 so 庫

    點擊 Make Project,生成 JNITest.class 文件

    使用 Project 方式查看當前項目,在當前目錄下可以看到你的 JNITest.class 文件

    打開 Android Studio 的 Terminal 到 移動到 app/src/main 目錄下

使用 javah -d jni -classpath F:\workSpace\Android\JNITest\app\build\intermediates\classes\debug com.example.akon.jnitest.JNITest 命令創建 .h 的頭文件

    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 庫:

    接着打開 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 程序就寫完了。

---------------------

作者:Young_Time

來源:CSDN

原文:https://blog.csdn.net/young_time/article/details/80346631

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章