Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android NDK——配置NDK及使用Android studio開發Hello JNI並簡單打包so庫

Android NDK——配置NDK及使用Android studio開發Hello JNI並簡單打包so庫

編輯:關於Android編程

引言

盡管Android Studio已經越來越流行了,但很多人還是習慣於Eclipse或源碼環境下開發JNI應用。筆者是從以前在學校參加谷歌大學學術合作項目的時候接觸JNI的,當時是為了模仿底層的方法實現一個功能,使用的是Eclipse,直到最近項目中需要用到SmartLink、AirKiss才又再次接觸到JNI,第一次使用Android Studio開發NDK,遇到不少彎路再次總結下,以期能幫助新手快速入門不再迷茫。

一、NDK相關角色概述

1、NDK和SO

這裡寫圖片描述vcq9wLS199PDTkRLsuO1xKOsyrnTw9XiuPa5pL7fv8nS1Lrct72x47XEseDQtLrNtffK1EpOSbXEtPrC66Gj0vLOqkPT79HUsru/58a9zKijrNTaV2luZG93c8+1zbPPwsq508NOREux4NLr1NpMaW51eM/CxNzWtNDQtcS6r8r9v+ImbWRhc2g7Jm1kYXNoO1NPzsS8/qOsyKuzxlNoYXJlZCBPYmplY3Rzo6zG5Mq11sq+zcrH0ru20WOhomMrK7XEzbfOxLz+us3Ktc/WzsS8/rTysPyzydK7uPa/4qGjxL/HsEFuZHJvaWTPtc2zxL/HsNans9bS1M/Cxt/W1rK7zay1xENQVbzcubmjrMO/0rvW1rbU06bXxbj319S1xNOm08OzzNDytv69+NbGvdO/2kFCSaO6o6hBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlo6m2qNLlwcu2/r341sbOxLz+o6jTyMbkyscuc2/OxLz+o6nI57rO1MvQ0NTaz+DTprXEz7XNs8a9zKjJz6OstNPKudPDtcTWuMHuvK+jrMTatOa21Mbrtb2/ydPDtcTPtc2zuq/K/b/ioaM8L3A+DQpBUk12NSZtZGFzaDsmbWRhc2g7YXJtZWFiaSBBUk12NyAmbWRhc2g7Jm1kYXNoO2FybWVhYmktdjdhIEFSTXY4Jm1kYXNoOyZtZGFzaDthcm02NC0gdjhhIHg4NiZtZGFzaDsmbWRhc2g7eDg2IE1JUFMgJm1kYXNoOyZtZGFzaDttaXBzIE1JUFM2NCZtZGFzaDsmbWRhc2g7bWlwczY0IHg4Nl82NCZtZGFzaDsmbWRhc2g7eDg2XzY0DQo8cD7S1LG+yMtPRE2+rdHpwLTLtaOsxOPTprjDvqG/ycTctcTM4bmp16jOqsO/uPZBQknTxbuvuf21xC5zb87EvP6jrLWrsrvTprjDu+y6z9fFyrnTw6GjxOPTprjDzqrDv7j2QUJJxL/CvMzhuam21NOmtcQuc2/OxLz+oaO1sdK7uPbTptPDsLLXsNTayeixuMnPo6zWu9PQuMPJ6LG41qez1rXEQ1BVvNy5ubbU06a1xC5zb87EvP674bG7sLLXsKGj1Np4ODbJ6LG4yc+jrGxpYnMveDg2xL/CvNbQyOe5+7Tm1Nouc2/OxLz+tcQgu7CjrLvhsbuwstewo6zI57n7sru05tTao6zU8rvh0aHU8WFybWVhYmktdjdh1tC1xC5zb87EvP6jrMjnufvSsrK7tObU2qOs1PLRodTxYXJtZWFiacS/wrzW0LXELnNvzsS8/qOo0vLOqng4NsnosbjSstanILPWYXJtZWFiaS12N2G6zWFybWVhYmmjqaGjcHM6IE5hdGl2ZSBMaWJzIE1vbml0b3Ig1eK49tOm08O/ydLUsO/W+s7Sw8fA7b3iyta7+snPsLLXsLXEQVBL08O1vcHLxMTQqS5zb87EvP6jrNLUvLAuc2/OxLz+wLTUtNPaxMTQqbqvyv2/4rvy1d+/8rzcoaM8L3A+DQo8aDIgaWQ9"2jni">2、JNI

這裡寫圖片描述
JNI 全稱Java Native Inteface,即Java本地接口,是Java中定義的一種用於連接Java和C/C++接口的一種實現方式。Java語言裝載到虛擬機中,不能和硬件交互,不能驅動開發。JNI擴展了Java虛擬機的能力,驅動開發、無線熱點共享,底層語言(C、C++)效率高,數學運算、實時渲染的游戲,音視頻處理等等,簡而言之,就是Java代碼調用c、c++代碼,JNI模式一共涉及到三個角色:C/C++ 代碼本地方法接口類Java層中具體業務類

1、JNI簡要流程

這裡寫圖片描述

2、JNI的變量類型與Java類型對比表

Java中變量的類型 JNI對應的類型名 C/C++變量類型 boolean jboolean unsigned char float jfloat float double jdouble double byte jbyte signed char char jchar unsigned short short jshort short int jint/jsize int long jlong long long Object jobject void * String jstring void *

3、JNI的基本語法

命名規則
JNIExport jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,jobject thiz )
這裡寫圖片描述

Java端加載so

 System.loadLibrary("helloJni");//加載so文件,不要帶上前綴lib和後綴.so
Java端的調用jni
((TextView)findViewById(R.id.jni_text)).setText(helloJni());

3、Gradle

Gradle 是一個基於Apache Ant和Apache Maven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置。以往Android NDK開發需要在Eclipse或源碼環境下,建立並配置Android.mk和Application.mk,且還要通過java命令生成.h頭文件,才能編譯生成so庫。但在Android Studio中這些步驟都不需要,因為Gradle足夠強大,只需配置Gradle即可編譯生成so庫。

三、開發JNI的步驟

JNI代碼主要又分為Native代碼和Java代碼,所以我們得實現Native端和Java端

1、安裝NDK配置環境變量和相關插件(NDK、CMake、LLDB)

這裡寫圖片描述

把NDK裡build目錄添加到path變量 ,比如我的目錄是D:\AndroidDevlopment\SDK\ndk-bundle

這裡寫圖片描述

2、新建一個Android標准工程,並在工程設置中配置NDK路徑。

這裡寫圖片描述

3、打開app下的 build.gradle,配置NDK和在gradle.properties裡配置android.useDeprecatedNdk=true

 ndk{
    moduleName "helloJni"//*生成的so文件名,必填
    abiFilters "armeabi", "armeabi-v7a", "x86" //配置輸出的abi體系結構下的so庫,
}

配置支持NDK

android.useDeprecatedNdk=true//是灰色的不影響

這裡寫圖片描述
若不配置android.useDeprecatedNdk=true點擊腳本同步,之後會報這個錯誤
這裡寫圖片描述

4、在Actiivty類文件裡定義jni本地接口方法

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("helloJni");//加載so文件,不要帶上前綴lib和後綴.so
    }
    public native String helloJni();//定義本地方法接口,這個方法類似虛方法,實現是用c或者c++實現的

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

5、生成對應的C文件默認實現

在我們定義了本地接口方法之後,我們在方法上按alt+Enter,然後生成對應的方法,可是不出意外的話生成的c文件只是有一個頭文件的,並沒有為我們生成對應的方法框架,

#include 

如果你熟悉Jni的語法可以自己去實現,但是太麻煩了,幸好谷歌為我們提供了一個插件gradle-experimental,我們只需要在app下的gradle.build腳本裡配置(僅僅在我們生成jni方法框架時添加,當我們全部添加完JNI方法框架之後,必須注釋或者刪除掉,否則run的時候就絕對報錯)

gradle-experimental插件
在2015年5月的Google I/O大會上, Google宣布Android Studio開始支持NDK開發,通過和JetBrains的合作,將Clion整合進了Android Studio 1.3,並免費支持NDC++開發。同年7月,在Android Studio 1.3版本上添加了 gradle-experimental插件,該插件支持NDK開發和調試,且帶有代碼不全和重構等高級功能。
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.tools.build:gradle-experimental:0.7.0'//僅僅在我們生成jni方法框架時添加,當我們全部添加完JNI方法框架之後,必須注釋或者刪除掉,否則run的時候就絕對報錯
}

配置成功了之後,再執行下腳本,把原來生成的jni文件夾刪除掉,再按萬能鍵,這時候就妥妥滴生成了c文件

#include 

JNIEXPORT jstring JNICALL Java_crazymo_train_jnitraining_MainActivity_helloJni(JNIEnv *env,jobject instance){
    // TODO
    return (*env)->NewStringUTF(env, "Hello Jni");
}

6、完成上面5個步驟之後,就可以make或者run了,然後就會生成對應的so文件(..\build\intermediates\ndk\debug\obj\local)

完整的Activity實現如下:

package crazymo.train.jnitraining;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("helloJni");//加載so文件,不要帶上前綴lib和後綴.so
    }
    public native String helloJni();//定義本地方法接口,這個方法類似虛方法,實現是用c或者c++實現的

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((TextView)findViewById(R.id.jni_text)).setText(helloJni());//調用JNI
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved