本項目需要安裝android studio 以及設定相應環境變量,請查看上一個博客。
1.新建New ->New Project 選擇Empty Activity 點擊Next 。
2.項目名爲T613_IIC(根據個人項目,設定名稱) 。
3.點擊app 框,選擇虛擬設備,虛擬設備出現helloworld 說明運行正常,否則環境沒有設定好,重新檢查設定。
4.爲了產生.so庫,先新建一個含有Native 方法的Java類。
1)右擊com.examples.t613_iic->New->Java ,新建t613_correction.java文件。
2)在文件中,添加Native 方法,T613_algorithm就是要加載的.so 庫名稱。
3)點擊MainActivity ,調用Native 方法。
package com.example.t613_iic;
public class t613_correction {
// 動態導入 so 庫
static {
System.loadLibrary("T613_algorithm");
}
//創建一個 native 方法
public native static String get();
}
package com.example.t613_iic;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("Message",t613_correction.get());
}
}
5.點擊Make Project 會在路徑:
T613_IIC\app\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes\com\example\t613_iic 下產生
t613_correction.class文件。
6.生成JNI 的.h頭文件。
1)點擊studio 底部的Terminal 進入終端,切入到main 目錄下。
2)執行
javac -encoding utf8 -h .\jni E:\Lightning2\android\app\T613_IIC\app\src\main\java\com\example\t613_iic\
t613_correction.java 命令,該命令表示在當前目錄下生成jni 文件夾,並且產生 t613_correction.java的本地庫的頭文件。
3)在路徑 T613_IIC\app\src\main\jni 下可以看到com_example_t613_iic_t613_correction.h頭文件。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_t613_iic_t613_correction */
#ifndef _Included_com_example_t613_iic_t613_correction
#define _Included_com_example_t613_iic_t613_correction
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_t613_iic_t613_correction
* Method: get
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_t613_1iic_t613_1correction_get
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
7.新建auto_correction.c 庫文件
1)右擊jni->New->C/C++ Source File 。
2).c內容包含步驟 6 中產生的頭文件,並且將頭文件中Native 方法放入其中(從這裏面大家應該能看到我們要封裝成.so的C庫 函數名和我們步驟 4 中創建的Native 方法的名稱已經聯繫起來了,這就是JNI 的作用,將java 和c/c++ 建立一種轉換機制)。
//
// Created by terawins on 2019/7/5.
//
#include<jni.h>
#include<stdio.h>
//導入我們創建的頭文件
#include "com_example_t613_iic_t613_correction.h"
JNIEXPORT jstring JNICALL Java_com_example_t613_1iic_t613_1correction_get
(JNIEnv *env, jclass jclass){
//返回一個字符串
return (*env)->NewStringUTF(env,"This is my first NDK Application,my name is navy");
}
8.新建Android.mk文件
1)右擊jni->New->File 。
2)爲auto_correction.c 編寫.mk文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := T613_algorithm
LOCAL_LDFLAGS := -Wl,--build-id
LOCAL_SRC_FILES := E:\Lightning2\android\app\T613_IIC\app\src\main\jni\auto_correction.c
LOCAL_C_INCLUDES += E:\Lightning2\android\app\T613_IIC\app\src\debug\jni
LOCAL_C_INCLUDES += E:\Lightning2\android\app\T613_IIC\app\src\main\jni
include $(BUILD_SHARED_LIBRARY)
9.修改build.gradle 自動生成.so庫 (該步驟也可以通過Terminal 下在jni 目錄使用ndk-build 命令手動生成.so庫,不再詳述)
1)點擊build.gradle 增加ndk 編譯命令 。
2)右擊Android.mk->Link C++ Project with Gradle ,彈出Link C++ Project with Gradle 對話框,選擇ndk-build以及Android.mk 路徑,點擊OK ,將會在build.gradle中生成 externalNativeBuild 代碼段。
ndk{
moduleName "T613_algorithm" //生成的so名字
abiFilters "armeabi-v7a", "x86" //不同體系架構下的so庫。
}
externalNativeBuild {
ndkBuild {
path file('src/main/jni/Android.mk')
}
}
10.點擊點擊app 框,將看到.so庫中的This is my first NDK Application,my name is navy 這句話被打印,運行虛擬機,可以看 到 T613_IIC 已運行。
11. 在目錄:E:\Lightning2\android\app\T613_IIC\app\build\intermediates\ndkBuild\debug\obj\local\armeabi-v7a 和
E:\Lightning2\android\app\T613_IIC\app\build\intermediates\ndkBuild\debug\obj\local\x86 下查看不同架構使用的.so庫。
注意事項:(1)t613_correction.c 加載的庫的名稱T613_algorithm和build.gradle 中ndk 代碼段中生成.so庫名稱T613_algorithm以及 Android.mk 中LOCAL_MODULE := T613_algorithm 名稱要一致。