Android JNI介紹(一)- 第一個Android JNI工程

1、簡述

在平時的開發過程當中,大多數人可能沒有JNI方面的需求,所以JNI方面的工程配置、如何開始也都不太瞭解,而網上對此方面的介紹也比較少。所以,本系列文章將從一個新手的角度開始,介紹JNI編程。java

2、NDK簡介

Android NDK 是一套容許您使用 C 和 C++ 等語言,以原生代碼實現部分應用的工具集。在開發某些類型的應用時,這有助於您重複使用以這些語言編寫的代碼庫。android

3、JNI簡介

JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其餘語言的通訊(主要是C&C++)。從Java1.1開始,JNI標準成爲Java平臺的一部分,它容許Java代碼和其餘語言寫的代碼進行交互。編程

4、Android Studio建立簡單的JNI工程

在建立Android Project時,在建立的首頁中勾選Include C++ support選項便可建立一個模板的hello world程序,可直接運行。相比於普通的Android工程,勾選該項後的工程有如下不一樣: bash

工程目錄

gradle配置

能夠看到,多出了一個native-lib.cpp(C++代碼)文件和一個CMakeLists.txt(C++相關配置)文件,app模塊下的build.gradle文件也添加了相關配置。app

在該默認工程中,咱們能夠看到一些相關代碼:工具

CMakeLists內容:gradle

# 聲明最低的cmake版本
cmake_minimum_required(VERSION 3.4.1)
# 添加一個名稱叫native-lib的動態庫,該庫的源文件爲src/main/native-lib.cpp
add_library( native-lib # 庫的名稱
             SHARED # SHARED:動態庫、STATIC:靜態庫
             src/main/native-lib.cpp # 源文件,能夠是多個
             )
             
# 尋找系統中的log庫,保存在log-lib變量中
find_library( log-lib 
              log )
              
# native-lib這個庫會去依賴log-lib這個庫
target_link_libraries( native-lib
                       ${log-lib} )
複製代碼

Java中加載本地庫,而且定義native方法:ui

// 加載的library名稱,注意:不是C++文件的名稱
    static {
        System.loadLibrary("native-lib");
    }
複製代碼
/**
     * java中定義方法的名稱,會根據包名、類名、參數、返回值類型尋找對應的C++方法
     */
    public native String stringFromJNI();
複製代碼

C++中定義好對應的方法:this

//對應於java中的stringFromJNI方法
extern "C" JNIEXPORT jstring JNICALL Java_com_wsy_jnitest_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
複製代碼

這樣便可實現C++向Java傳遞一個String。其中的映射規則會在後面進行介紹。google

5、工程中的各個文件的關係的梳理

build.gradle:總配置文件,在其中指定CMakeLists.txt的路徑;
CMakeLists.txt:native代碼的配置,包括和其餘庫的依賴配置、工程庫編譯出的結果(靜態庫、動態庫、可執行文件)等;
主C++文件:native代碼的實現;

以上就是一個簡單的JNI操做,實際的開發過程當中不可能僅僅只是這麼簡單的一個操做,後面會對一些具體操做進行介紹。包括CMakeLists、Java和C++的互相調用、異常處理等。

相關文章
相關標籤/搜索