1. 程式人生 > >Android Studio開發JNI工程

Android Studio開發JNI工程

轉:http://www.2cto.com/kf/201412/361768.html

使用Android Sutdio建立一個新的工程後,接下來記錄建立NDK工程的基本步驟。 本文將達到:

1. 建立NDK工程

2. 在JNI中輸出Log語句

3. 指定編譯的so庫的abi版本

4. 解決在建立NDK工程中的問題

Step: 1. 新增native介面注意寫好native介面和System.loadLibrary()即可了,並無特別之處

。P.S:onCreate()中對R.id.txt執行setText(),所以這裡需要對xml佈局檔案按正常的開發步驟進行修改即可。 直接給出程式碼如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class MainActivity extends Activity{ static { System.loadLibrary("JniTest"); } public native String getStringFromNative(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); TextView txtView = (TextView) findViewById(R.id.txt); txtView.setText(getStringFromNative()); } }

Step: 2.執行Build->Make Project

\

這一步驟執行一下,驗證工程中並無其它錯誤,並對工程進行了編譯,生成了.class檔案..class檔案的生成路徑是在 app_path/build/intermediates/classes/debug下的.如下圖:\

Step: 3.javah生成c標頭檔案

點選"View->Tool Windows->Terminal",即在Studio中進行終端命令列工具.執行如下命令生成c語言標頭檔案。這裡需要注意的是要進入 \app\src\main的目錄下執行javah命令,為的是生成的 .h 檔案同樣是在\app\src\main路徑下,可以在Studio的工程結構中直接看到。 操作命令:javah -d jni -classpath <sdk_android.jar>;<app_classes> lab.sodino.jnitest.MainActivity具體操作圖如下:

\

 例如:javah -d jni -classpath D:\Dev\Android\android-sdk-windows\platforms\android-16\android.jar;..\..\build\intermediates\classes\debug com.example.abc.MainActivity

1 2 javah -d jni -classpath c:\Users\sodinochen\AppData\Local\Android\sdk\platforms \android-16\android.jar;..\..\build\intermediates\classes\debug lab.sodino.jnitest.MainActivity

對於"主版本51比50新,此編譯器支援最新的主版本"則是由於電腦上安裝了兩個版本的jdk引起的,而當前使用的是舊的jdk。把舊的jdk刪除,並執行java version命令後顯示當前jdk為最新的1.7時,則不會再有此提示了。如下圖:

\

最後的生成結果: <喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD48cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20141216/2014121608565552.png" alt="\" />

Step: 4.編輯c檔案

在main.c檔案中實現標頭檔案中的方法,具體功能為直接return回一個String,並且使用android_log打印出相關日誌。程式碼如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> #include #ifndef LOG_TAG #define LOG_TAG "ANDROID_LAB" #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) #endif /* Header for class lab_sodino_jnitest_MainActivity */ #ifndef _Included_lab_sodino_jnitest_MainActivity #define _Included_lab_sodino_jnitest_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: lab_sodino_jnitest_MainActivity * Method: getStringFromNative * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_lab_sodino_jnitest_MainActivity_getStringFromNative (JNIEnv * env, jobject jObj){ LOGE("log string from ndk."); return (*env)->NewStringUTF(env,"Hello From JNI!"); } #ifdef __cplusplus } #endif #endif </android></jni.h>

到這裡後,我們再執行一個"Build->Make Project",發現"Messages Gradle Build"會給出提示如下:

?
1 2 3 4 Error:Execution failed for task ':app:compileDebugNdk'. > NDK not configured. Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties. (On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)

這裡提示了NDK未配置,並且需要在工程中的local.properties檔案中配置NDK路徑。好了,提示很清楚了,那我們就進入下一步吧。
Step: 5.配置NDK這一步包括兩個動作:

1.指明ndk路徑\

2. 修改build.gradle配置    工程中共有兩個build.gradle配置檔案,我們要修改的是在\app\build.gradle這個檔案。為其在defaultConfig分支中增加上

?
1 2 3 4 5 ndk { moduleName "JniTest" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" }

以上配置程式碼指定的so庫名稱為JniTest,連結時使用到的庫,對應android.mk檔案中的LOCAL_LDLIBS,及最終輸出指定三種abi體系結構下的so庫。新增後如下圖:\

這時,再執行"Build->Rebuild Project",就可以編譯出so檔案了。但在Window平臺上會出現一個問題:

?
1 2 3 4 5 6 7 Error:Execution failed for task ':app:compileDebugNdk'. > com.android.ide.common.internal.LoggedErrorException: Failed to run command: D:\Mission\adt-bundle-windows\ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-21 NDK_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi,armeabi-v7a,x86 Error Code: 2 Output: make.exe: *** No rule to make target `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni', needed by `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni\main.o'. Stop.

出現這個錯誤很莫名其妙..幾番折騰下,找到一個視訊出來了大概原因及解決方式:出處見Youtube視訊 02:50分開始:https://www.youtube.com/watch?v=okLKfxfbz40#t=362在Windows下NDK一個bug,當僅僅編譯一個檔案時出現會出現此問題,解決方法就是再加入一個空util.c檔案即可。編譯出來的庫檔案被Studio輸出到了下圖的路徑中

\

Step: 6.安裝執行

介面:

\

檢視Log列印:

相關推薦

Android Studio開發JNI工程

轉:http://www.2cto.com/kf/201412/361768.html 使用Android Sutdio建立一個新的工程後,接下來記錄建立NDK工程的基本步驟。 本文將達到: 1. 建立NDK工程 2. 在JNI中輸出Log語句 3. 指定編譯的so庫的abi版本 4. 解決在建

Android studio開發Java工程

  1. 新建專案 新建專案肯定是去new,但到底是new project還是new module是一個問題。在這解釋一下,如果new project的話是新建一個工程,相當於新建一個工作區,工程中可以有多個模組也就是所謂的module,每個模組之間相互獨立。有了這個前提,在開

Android Studio開發jni例項詳解 (呼叫C程式碼例項)

FATAL EXCEPTION: main Process: com.example.jni.jnitest, PID: 30152 java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$Dele

Android Studio開發JNI示例

JNI和NDK介紹 JNI(Java Native Interface),是方便Java呼叫C、C++等Native程式碼所封裝的一層介面,相當於一座橋樑。通過JNI可以操作一些Java無法完成的與系統相關的特性,尤其在影象和視訊處理中大量用到。 NDK(Nat

使用Android Studio開發 JNI

新版本的Android Studio支援使用CMake來編譯JNI,使得開發帶有C或者C++語言的程式碼變得簡單的許多,下面一個簡單的示例專案 環境 Android Studio 2.2 build-tools 版本 2.2.0-alpha6 NDK支援

Android studioJNI 開發實例

ndk create void 上層 執行效率 約束 添加 src 傳輸協議 在AS中進行 NDK 開發之前,我們先來簡單的介紹幾個大家都容易搞懵的概念: 到底什麽是JNI,什麽是NDK? 何為“交叉編譯”? 先看什麽是 JNI?JNI 的全稱就是

Android studioJNI 開發例項

 在AS中進行 NDK 開發之前,我們先來簡單的介紹幾個大家都容易搞懵的概念:  到底什麼是JNI,什麼是NDK?  何為“交叉編譯”?     先看什麼是 JNI?JNI 的全稱就是 Java Native Interface,即java本地開發介面。可能大家和我一樣,一聽到介面什麼的就犯懵:“

Android Studio NDK/JNI開發

前言        我們在一步一步學習JNI(一)學習了怎麼進行Jni開發,當時說道了怎麼編寫native函式,怎麼進行載入,怎麼進行so生成,當時的都是在eclipse下生成的。這裡我們就來說說Android Studio下怎麼程序開發。 下載NDK

Android Studio ndk-Jni開發 示例

Java Native Interface (JNI)標準是java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行互動。JNI 是本地程式設計介面,它使得在 Java 虛擬機器 (VM) 內部執行的 Java 程式碼能夠與用其它程式語言(如 C、C++ 和組合

Android Studio開發時多工程引用相同Library專案的配置方法

在使用Android Studio開發的時候,如遇到多個專案引用同一個library(原始碼)的情況時,會遇到在每個專案中都要有一套library的程式碼的情況,對於還在開發和維護中的Library需要頻繁的修改,這對同步就很麻煩,為了解決這個問題,出現了下面的解決方案。

Android Studio 開發利器【經常使用插件】

媽媽 ctrl+alt 快捷鍵 發現 fill sta andro fonts wid 1.ADB Idea ADB操作快捷菜單。高速清除數據,重新啟動應用,卸載應用等 快捷鍵: Windows: Ctrl+Alt+Shift+A

在Ubuntu17.04上搭建Android Studio開發環境

term ora jdk1.8 png ava upd com all img 在實驗課上都是在Ubuntu環境下,雖然之前都是在windows系統裏寫android程序,但是我還是準備在Ubuntu下配置一個Android Studio環境。 通過百度,我先看到一個最簡單

android studiojni底層日誌的打印

添加 註意 erro ldl end 1.0 dto 字符 ati 1 添加ndk對log支持若需要添加ndk對log的支持,只需要通過以下2步即可實現。 1.1 修改Android.mk如生成的庫文件是“.so文件”,則在Android.mk中添加如下內容:LOCAL_L

安裝Android Studio開發環境

1-1 path pan style color img 組件 evel 3.3 下載安裝包 中文社區官網 http://android-studio.org/ 目前最新的是2.3.3版本 安裝Android Studio 雙擊安裝 等待安裝包自動解壓

android studio 開發中啟動android項目報錯sdk版本不一致解決方案

技術分享 發現 依賴 adl 目的 clas studio ima 需要 安卓項目開發中新建項目後再run‘的時候發現報錯com.android.support:appcompat-v7依賴報錯 查看下build.gredle所配置的參數: 打開項目的bui

Android Studio開發-高效插件強烈推薦

bus 工作 install mis enc new ring 介紹 rem Android Studio開發-高效插件強烈推薦 現在Android的開發者基本上都使用Android Studio進行開發(如果你還在使用eclipse那也行,畢竟你樂意怎麽樣都行)

Android Studio安裝部署系列】二、Android Studio開發環境搭建

alt nand inf ima str php span 開發環境搭建 index.php 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 概述 Android Studio開發環境安裝步驟 下載Android Studio 下載地址: http://ww

Android Studio開發獲取本地時間

import 自己 public ack info 聊天記錄 datetime AS IV 實現本地聊天記錄功能,用到獲取本地時間的函數,感覺比較實用,分享給大家! 1、在相應moudle的java文件夾下建立自己的util文件夾如·: 2、建立DateUtil類 pa

Android Studio 新建Andorid工程報錯: Conflict with dependency 'com.android.support:support-annotations'

bug 方法 andro erro failed resolv and div tails 新建Android工程報錯: Error:Execution failed for task ‘:app:preDebugAndroidTestBuild‘. > Confl

如何使用Android Studio開發/調試Android源碼

分享 選擇 運行 工程 很多 abi 技術 frame num 環境: Ubuntu 14.10,openJdk 1.7,Android Studio 3.0.0,android-5.1.1_r1源碼 生成android項目工程:先編譯源碼mmm development