天天看點

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

作者:位元組流動

來源:

https://blog.csdn.net/Kennethdroid/article/details/86418725

通過 Android Studio 預設的方式

建立帶有 native 方法的類,build 項目。

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。
NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。
NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。
NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

生成與類名相關的 .h 檔案。

進入 app -> build -> intermediates -> classes -> debug 目錄下

執行:

javah com.haohao.hellojni.MyJNI

(先配置好 JDK 的環境變量),生成 com_haohao_hellojni_MyJNI.h 檔案

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

建立 cpp 檔案。

在 main 檔案夾下,建立 jni 目錄,剪切 .h 檔案到 jni 目錄下,建立 hello.cpp 檔案

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

hello.cpp

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

配置 build.gradle 檔案。

修改 app/build.gradle 檔案, muduleName 為引入的 .so name , 直接運作項目,安裝 apk ,運作就 OK 了

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

生成的 .so 檔案位置。

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

PS: 未指定 CPU 架構時,AS 會生成支援所有 CPU 架構的 .so 檔案。

通過 ndk-build

建立

Android.mk

Application.mk

檔案。

建立一個項目,在 app 目錄下(任目錄下都可以)建立 jni 檔案,添加

檔案,以及 com_haohao_hellojni_MyJNI.h 檔案(運用上一小節的方法生成)。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

# 要生成的.so庫名稱。java代碼System.loadLibrary("hello");加載的就是它
LOCAL_MODULE := hello

# C++檔案
LOCAL_SRC_FILES := hello.cpp

include $(BUILD_SHARED_LIBRARY)      
# 不寫 APP_ABI 會生成全部支援的平台,目前支援:armeabi arm64-v8a armeabi-v7a
# APP_ABI := armeabi arm64-v8a armeabi-v7a mips mips64 x86 x86_64
APP_ABI := armeabi arm64-v8a armeabi-v7a      

生成 .so 檔案。

在 jni 目錄下(配置好NDK環境變量)直接執行 ndk-build , 生成 .so 檔案。

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

配置項目工程。

在 main 目錄下建立 jniLibs 目錄,并拷貝 armeabi arm64-v8a armeabi-v7a 檔案夾,運作 proj 。

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。
NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

通過 CMake 工具。

從 Android Studio 2.2 開始,就預設使用 CMake 工具建構 NDK 項目,請確定你的 AS 版本大于 2.2 。

通過 IDE 自動建構

建立項目時,勾選

Include C++ support

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

選擇預設的

Toolchain Default

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

AS 自動生成 CMakeLists.txt 檔案(CMake 建構腳本)

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。
NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

CMakeLists.txt

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library. 
# 指定CMake的最小版本
cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
# 設定子產品名為 native-lib,SHARED 可分享的,以及配置源檔案的路徑
add_library( # Sets the name of the library. 設定子產品名
             native-lib

             # Sets the library as a shared library. 
             SHARED 

             # Provides a relative path to your source file(s). 檔案路徑
             src/main/cpp/native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
# 找到 log 本地子產品
find_library( # Sets the name of the path variable. 
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
# 關聯 native-lib 子產品和 log 子產品
target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )      

在配置 app/build.gradle ,針對特殊平台 abiFilters 。配置完成之後,同步,運作。

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

手動建構

建立一個工程,建立 native 類,快捷鍵 Alt + Enter ,自動建立 jni 目錄和相應的 .cpp 檔案。

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

native-lib.cpp

#include <jni.h>
#include <string>

extern "C"

JNIEXPORT jstring JNICALL
Java_com_haohao_ndk_1cpp_MyJNI_stringFromJNI(JNIEnv *env, jobject instance) {

    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}      

在工程根目錄下建立 CMakeLists.txt 檔案。

# 指定CMake的最小版本
cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library. 設定子產品名
             native-lib

             # Sets the library as a shared library. 
             SHARED 

             # Provides a relative path to your source file(s). 檔案路徑
             src/main/cpp/native-lib.cpp )
      

選擇

app

modulde ,右擊選擇

Link C++ Project with Gradle

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

選擇腳本檔案的路徑。

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

app/build.gradle 會自動同步。同步完成後,運作項目。

NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。

 NDK 開發系列文章:

「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
NDK 編譯的三種方式通過 Android Studio 預設的方式通過 ndk-build通過 CMake 工具。