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.MainActivity1 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 studio 下 JNI 開發實例
ndk create void 上層 執行效率 約束 添加 src 傳輸協議 在AS中進行 NDK 開發之前,我們先來簡單的介紹幾個大家都容易搞懵的概念: 到底什麽是JNI,什麽是NDK? 何為“交叉編譯”? 先看什麽是 JNI?JNI 的全稱就是
Android studio 下 JNI 開發例項
在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 studio 中jni底層日誌的打印
添加 註意 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