android studio 3.4.1 版 NDK 自動編譯產生第三方.so 庫(一)

本項目需要安裝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 名稱要一致。

 

 

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