Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android studio環境下的 NDK(jni)開發

Android studio環境下的 NDK(jni)開發

編輯:關於Android編程

前言

1、什麼是NDK?

NDK全稱是Native Development Kit,NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。NDK集成了交叉編譯器(交叉編譯器需要UNIX或LINUX系統環境),並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創建出so。

2、為什麼使用NDK?

1、代碼的保護。由於apk的java層代碼很容易被反編譯,而C/C++庫反匯難度較大。
2、可以方便地使用現存的開源庫。大部分現存的開源庫都是用C/C++代碼編寫的。
3、提高程序的執行效率。將要求高性能的應用邏輯使用C開發,從而提高應用程序的執行效率。
4、便於移植。用C/C++寫得庫可以方便在其他的嵌入式平台上再次使用。

3、什麼是JNI?

JNI的全稱是Java Native Interface,它提供了若干的API實現了Java和其他語言的通信(主要是C和C++)。

4、為什麼使用JNI?

JNI的目的是使java方法能夠調用c實現的一些函數。

5、安卓中的so文件是什麼?

android中用到的so文件是一個c++的函數庫。在android的JNI中,要先將相應的C語言打包成so庫,然後導入到lib文件夾中供java調用。

Android studio ndk開發環境配置

首先,studio已經可以進行安卓SDK開發了,就是說之前的jdk啥的都可以用。那麼,接下來就是ndk的環境配置。(studio不用像eclipse那樣安裝Cygwin,這就是studio的強大之處)

下載後雙擊運行解壓,等待即可。注意:運行後的解壓過程可能比較長,一定要等全部解壓完成(cmd框會提示everything finished)。然後,在解壓目錄下會有ndk-build(後面會用到)。如圖所示:
這裡寫圖片描述vcirsr/N6rPJPC9zdHJvbmc+o6mhozwvaDM+DQo8aDMgaWQ9"2打開studio新建一個工程fileproject-structure-設置ndk路徑就是你解壓的路徑">2、打開studio,新建一個工程,file>>project structure 設置ndk路徑,就是你解壓的路徑

這裡寫圖片描述
然後點擊OK。

3、新建本地方法

在activity中(或者寫一個類)新建如下:
這裡寫圖片描述

這時候,方法名是紅色的,報紅是因為還沒有生成so文件,沒有通過so文件調用。(可以看到這個方法的聲明中有native關鍵字,這個關鍵字表示這個方法是本地方法,也就是說這個方法getStrFromJNI()是通過本地代碼(C/C++)實現的,在java代碼中僅僅是聲明。)

4、生成.h文件(這一步不是必須做的,只是為了方便寫.c文件而做的,可以刪掉)

studio的Terminal窗口下,進入到該工程的java目錄下(如下圖所示),然後輸入javah -jni 包名.類名,如下:

這裡寫圖片描述

然後Enter,會生成相應的.h文件,如下。(如果有多個類中新建了本地native方法,就分別重復以上操作,就會生成多個.h文件吧)
這裡寫圖片描述
該文件只是為了輔助我們寫出相應的.c文件,使用完了即可刪除。文件內容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_example_administrator_ndkdemo_MainActivity */

#ifndef _Included_com_example_administrator_ndkdemo_MainActivity
#define _Included_com_example_administrator_ndkdemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_administrator_ndkdemo_MainActivity
 * Method:    getStringFromNative
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_administrator_ndkdemo_MainActivity_getStringFromNative
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif        

有用的就是
這裡寫圖片描述
仔細觀察可以看到他是遵循“Java_包名類名本地方法名”來組織的(了解到這些後我們以後就可以不生成.h文件然後直接去寫.c文件了)。

5、在main下(或者app下)新建 jni文件夾,編寫.c文件

這裡寫圖片描述
在jni下新建.c文件,在裡面寫方法,如下:
這裡寫圖片描述

6、jni下編寫Android.mk文件

編輯Android.mk代碼:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE        := demo         //要生成的so庫的名稱,但實際為libdemo.so
LOCAL_SRC_FILES     := demo.c       //要使用的文件,剛才編寫的demo.c文件

include $(BUILD_SHARED_LIBRARY)

7、生成so文件(重要

在studio控制台中,進入到工程的main(或者是app)目錄下(就是jni所在目錄的上一級),然後輸入ndk-build(如下所示),不出問題即可編譯成功。

這裡寫圖片描述

或者進入cmd中操作是一樣的。
編譯完成後刷新工程,可以看到在app目錄下生成的libs和obj文件夾,其中libs是有用的,obj文件夾無用可以刪除。libs中的可以看到生成的libdemo.so文件。

這裡寫圖片描述

8、加載so文件,調用本地方法

這裡寫圖片描述

注意:在以上過程中可能會報錯,需要進行一些設置

1、在app的build.gradle的android節點下設置:

這裡寫圖片描述
2、jni下新建空的.c文件
這裡寫圖片描述
3、gradle.properities中添加代碼如下:
這裡寫圖片描述

最後點擊運行ok

   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved