【JNI開發】之從零開始

本文開發工具基於 Android Studio 3.0.1java

1. Android Studio  NDK配置

NDK 下載(配置)以下圖所示:android


Android Studio 中 NDK 配置

下載(配置)完成後在SDK目錄下會有以下 ndk-bundle 文件夾,以下圖:c++


NDK 配置完成後在 SDK 目錄下會有 ndk-bundle 文件夾



2. JAVA及NDK環境變量配置

JAVA 環境變量配置:

新建 JAVA_HOME 環境變量,並配置: C:\Program Files\Java\jdk1.8.0_31app

配置 Path 環境變量:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin工具

配置 CLASSPATH 環境變量:.;%JAVA_HOME%\lib (或更加精確的配置 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar開發工具

檢查 JAVA 環境變量是否配置成功,在命令行輸入 java -version ,出現以下表示配置成功。gradle


JAVA 環境變量配置成功

NDK環境變量配置:

在系統環境變量 Path 下增長 ndk-bundle 路徑:G:\sdk\sdk\ndk-bundleui


NDK 環境變量配置

檢驗 NDK 是否配置成功。在命令行輸入 ndk-build 命令,出現以下表示配置成功。命令行


NDK 環境變量配置成功



3. 新建項目(New Project)並配置項目

在 Android Studio 中新建一個項目 JNITest13d


新建一個項目

1. 檢查(配置) project 中的 local.properties ,是否有(添加):ndk.dir=G\:\\sdk\\sdk\\ndk-bundle  (新建項目會默認添加)


local.properties 配置

2. 配置 project 中的 gradle.properties,添加:android.useDeprecatedNdk=true


gradle.properties 配置

3. 配置 app 中的 build.gradle,在 defaultConfig 中添加:

ndk {

        moduleName "jnitest1"

}

moduleName 爲最後生成的 *.so 文件名,最後會生成 libjnitest1.so 文件(增長了 lib 前綴)


build.gradle 配置



4. 新建 Java 與 C 交互的Java接口類(如:TestJniInterface.java)

建立一個 TestJniInterface.java 類並定義一個方法 getJniName()


新建接口類並定義方法



5. 根據Java接口類生成頭文件(*.h 文件)

在命令行定位到 TestJniInterface.java 所在的 java 文件夾路徑 : F:\AndroidStudioProject\JNITest1\app\src\main\java

執行命令 javah com.ljstudio.android.jnitest1.TestJniInterface


javah 執行命令

執行完成後會在所在的 java 文件夾生成 .h 的頭文件 com_ljstudio_android_jnitest1_TestJniInterface.h

(JNI 取名規則爲包名 + 類名,JNI 方法會在前面加上了 Java_ ,包名和類名用 _ 分割)


生成頭文件



6. 編寫C/C++源文件(*.cpp 文件)

1. 在 main 目錄下新建一個 jni 文件夾,並把剛剛生成的頭文件 com_ljstudio_android_jnitest1_TestJniInterface.h 移動到 jni 文件夾下。

2. 在 jni 文件夾下建立 C/C++ 源文件 com_ljstudio_android_jnitest1_TestJniInterface.cpp 並編寫代碼 。

#include "com_ljstudio_android_jnitest1_TestJniInterface.h"

JNIEXPORT jstring JNICALL Java_com_ljstudio_android_jnitest1_TestJniInterface_getJniName

(JNIEnv *env, jclass) {

        return env -> NewStringUTF("Say hello from JNI!");

}

(Java 的 String 類型 轉換成了 C/C++ 中的 jstring,並用到 jni 中的 NewStringUTF 方法。)


新建源文件

編寫源文件



7. 打包成  *.so 文件

1. 在 jni 目錄下新建 Android.mk 文件並編寫 *.so 的生成規格

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := jnitest1

LOCAL_SRC_FILES := com_ljstudio_android_jnitest1_TestJniInterface.cpp

include $(BUILD_SHARED_LIBRARY)


Android.mk 文件

默認生成全部平臺下的 *.so 文件。

也可在指定相應平臺,jni 文件夾下新建 Application.mk 文件編寫規則:

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -fexceptions -std=c++0x

APP_ABI := armeabi-v7a

APP_PLATFORM := android-21

2. 在命令行定位到 jni 目錄 ,並執行 ndk-build 命令,執行成功以下圖。


ndk-build

3. 在 Android Studio 工程目錄下會生成 libs 及 obj 二個文件夾


ndk-build 執行成功

至此 *.so 文件生成成功,咱們能夠在 Android 項目中開心的用起來了。



8. Android 項目中使用 *.so 文件

1. 在 TestJniInterface.java 中添加

static {

        System.loadLibrary("jnitest1");

}


接口文件加載 so 文件


2. 在 app 的 build.gradle 的 defaultConfig 中添加

sourceSets.main {

        jniLibs.srcDir'src/main/libs'

        jni.srcDirs = []

}


設置加載 so 文件路徑


3. MainActivity中調用並運行,運行成功以下圖


MainActivity 中調用



運行結果



歡迎指正及讚揚!


簡書:個人簡書

掘金:個人掘金

CSDN:個人CSDN(待完善)

知乎:個人知乎(待完善)

GitHub:個人GitHub(待完善)

相關文章
相關標籤/搜索