AndroidStudio之NDK環境搭建,so檔案打包以及使用
本篇入門教程開發環境為mac + Android Studio + gradle 2.14.1,主要包含以下3塊內容:
-
NDK環境搭建
-
編寫第一個JNI專案
-
打包出動態so檔案,在其他專案中使用
一、NDK環境搭建
-
從Android Studio安裝
開啟AndroidStudio,選擇頂部工具條,Tools->Android->SDK Manager->SDK Tools->NDK 點選install -
自行下載ndk包
1)國內推薦通過 AndroidDevTools映象 下載,或者Google的官方網站下載Android NDK的安裝包 https://developer.android.com/ndk/downloads/index.html
NDK r13b
2)下載ndk包後解析到某個路徑,開啟Project Structure->設定 NDK location
AndroidDevTools 下載
-
ndk環境變數配置,我們需要使用到ndk-build命令
開啟終端 -> 輸入 :vim ~/.bash_profile -> 加入ndk 包的路徑(mac中環境變數之間以封號隔開)
自此,ndk開發環境我們已經可以進行jni開發了
二、JNI開發
-
建立android專案
-
檢視專案local.properties中加入ndk和sdk的路徑是否正確
ndk.dir=/Users/userName/AndroidStudioProjects/ndk/android-ndk-r13b sdk.dir=/Users/userName/Library/Android/sdk
-
配置專案下的gradle.properties檔案,表示我們要使用NDK進行開發。
android.useDeprecatedNdk=true
-
在moudle根目錄下的的build.gradle中的defaultConfig標籤內部里加入如下程式碼
ndk{ moduleName "hello" //生成的so檔名字,呼叫C程式的程式碼中會用到該名字 abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種平臺下的so庫,// 還可以新增 `x86_64`, `mips`, `mips64`}
-
編寫jni程式碼
package com.david.ndktest; -public class MainActivity extends AppCompatActivity { //使用靜態程式碼塊,表示我們要載入的資原始檔為libsecret.so static { System.loadLibrary("secret"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv_msg = (TextView) findViewById(R.id.tv_msg); tv_msg.setText(stringFromat()); } //宣告一個本地方法,用native關鍵字修飾 public native String stringFromat(); }
-
生成.h標頭檔案
直接使用Android Studio 底部的Terminal,預設命令列視窗路徑已經在當前專案,進入到app/src/main/java目錄,輸入以下命令(固定格式:javah -jni 包名+類名)
javah -jni com.david.ndktest.MainActivity
為在對應包的根目錄下生成.h檔案,熟悉該函式名後,日常開發中可以不用生成.h檔案
生成標頭檔案
-
執行第5部的時候,對應native會提示找不到對應方法,快捷鍵 alt+enter 會生成對應jni資料夾,包含libName.c檔案,此處MainActivity中的native方法還是會顯示紅色,但是不影響編譯
生成.c檔案
-
編譯專案後會發現app/build中已經生成so檔案,並且已經對應的cpu包就是我們在gradle中已經配置的,並且已經呼叫成功
build中生成對應so檔案
成功呼叫native方法
自此我們的第一個JNI專案已經編寫完畢
三、打包出動態so檔案,在其他專案中使用
有時候我們的需求是這樣的,我們把一些比較重要的業務邏輯封裝到ndk內部,對java層只暴露介面。我們就需要打包出so檔案,並且可能需要在其他專案中使用,下面將介紹so(符合JNI標準)檔案的打包,以及在其他專案中如何正確的呼叫
-
編寫Android.mk檔案,放到jni資料夾根目錄,與.c檔案同級
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := secret //lib 名LOCAL_SRC_FILES := /Users/userName/AndroidStudioProjects/NdkTest/app/src/main/jni/secret.c //.c檔名include $(BUILD_SHARED_LIBRARY)
-
使用ndk-build命令(需要配置ndk環境變數,參照第一步第3點),生成so檔案
進入到main目錄後在terminal中輸入命令,ndk-build工具便會幫我們打包出所有cpu平臺so檔案(目前不知道如何設定需要打包cpu平臺)
ndk-build
building so檔案
main根目錄下生成lib,obj目錄
-
其他專案中使用該so檔案
-
拷貝so檔案到專案的main/jniLibs目錄
-
==新建package,包名與類名以及方法名必須與生成so檔案的類保持一致!==
-
使用方法與第二部一致,需要宣告loadLibrary與native方法
-
-
呼叫native方法
com.keywea.duolintest; -public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv_msg = (TextView) findViewById(R.id.tv_msg); tv_msg.setText(com.david.ndktest.MainActivity.stringFromat()); } }
自此我們已經能夠接入符合JNI標準的so庫,重點在於包名,類名,方法名需要與so庫保持一致,因此我們在提供so庫的時候一定要記錄詳細的互動文件
相關文章
- Mac下AndroidStudio3.x的NDK開發環境搭建MacAndroid開發環境
- 從環境搭建到打包使用TypeScriptTypeScript
- Linux下NDK環境搭建!Linux
- Android Studio NDK:三、打包SOAndroid
- Android studio 整合ndk環境,生成so庫,並在其他專案上引用Android
- win10系統下如何搭建ndk環境_怎麼在win10系統下搭建ndk環境Win10
- 安卓自動化打包環境搭建安卓
- JNI初步(五)jni ndk 一個.so檔案依賴另一個.so檔案的寫法
- MapReduce環境搭建以及WordCount案例
- Jena TDB 環境搭建以及幾個工具的使用
- Rust 之環境搭建Rust
- Eclipse下搭建Android的NDK開發環境EclipseAndroid開發環境
- PHP開發環境 03 - 使用KFKDock搭建PHP專案環境PHP開發環境
- 安卓開發環境搭建之最新版(So Easy!)安卓開發環境
- vue官方webpack模版多個打包環境搭建VueWeb
- Mac 下 vue 開發環境的搭建以及專案建立MacVue開發環境
- 在Eclipse 下整合ndk 自動編譯生成so檔案Eclipse編譯
- Vue專案如何分環境打包Vue
- WebDriver環境搭建使用Web
- PHP本地檔案包含漏洞環境搭建與利用PHP
- NfS網路共享檔案系統環境搭建NFS
- lustre檔案系統環境搭建及測試
- SpringMVC基本環境搭建(配置檔案模板模板)SpringMVC
- AndroidStudio之NDK常見編譯錯誤Android編譯
- AndroidStudio專案打包成jarAndroidJAR
- Flutter(二)之環境搭建Flutter
- Docker 之 Nginx環境搭建DockerNginx
- Django之Ubuntu環境搭建DjangoUbuntu
- maven 使用-P指定環境打包,linux移動配置檔案失敗,windows成功!MavenLinuxWindows
- Vue搭建專案環境Vue
- 交叉編譯-Mac環境使用NDK編譯FFmpeg編譯Mac
- Gradle 使用技巧(二) - SO/NDK過濾Gradle
- 雲伺服器Ubuntu下搭建NDK環境,並編譯FFmpeg伺服器Ubuntu編譯
- Java環境搭建與配置、以及Tomcat搭建與配置JavaTomcat
- PCIE XDMA 開發環境搭建以及環路測試開發環境
- 使用docker搭建laravel環境DockerLaravel
- 利用IDEA進行JNI開發:使用NDK生成Linux平臺下的so檔案IdeaLinux
- Flutter指南之環境完整搭建Flutter