顯示具有 NDK 標籤的文章。 顯示所有文章
顯示具有 NDK 標籤的文章。 顯示所有文章

2013年12月8日 星期日

[ Android JNI ] NEON用C及ASM來實作

以下是利用NEON技術來進行灰階轉換

以下是利用ASM技術來進行灰階轉換



[ Android JNI ] 使用NEON及ASM技術來進行灰階轉換

承接上一篇文章

http://cheng-min-i-taiwan.blogspot.tw/2013/12/android-jni-ndkneon.html
以上程式請修訂在前一篇文章test.c中

 以下是新增函式


[ Android JNI ] 使用NDK及NEON技術來進行灰階轉換

請先閱讀上一篇文章
http://cheng-min-i-taiwan.blogspot.tw/2013/12/android-jni.html
本篇文章僅呈現有關NEON部份的程式碼
test.c程式列表,紅色圈起來地方表示有改變的部份
2. Android.mk 設備NEON編譯方式
3. Application.mk 指定編繹種類
4.執行結果





2012年11月11日 星期日

[ Android NEON] HelloNeon範例編譯和執行

讀可以先看看步驟14,奇怪事情發生了,可以編譯,但因有錯誤所以沒辦法執行。

1. 在eclipse上選擇File->Import。
 2.滙入helloneon專案
 3.記得要勾選Copy Project into Workspace
 4.匯入的檔案結構
5. 點選helloneon.c會發現許多.h前面都標示"?",表丕找不到該檔案。 
 6.執行結果失敗,其原因是因為沒有.so。
7. 執行時可以發現有關c的程式沒有被編譯,在專案上按下mouse右鍵,選擇Android Tools->Add Native Support。
8.刪除 com.example.neon.HelloNeon.cpp這個檔案是自動產生的。
 9.打開helloneon.c可以看到蟲蟲了,所以沒法編譯。
10.設定專案的properties。
 11.選擇C/C++ Genera->Paths and Symbol設定路徑。
 12.設定路徑
 13.所有.h都找到但helloneon-intrinsics.c還是有問題
 14.奇怪事情發生了,可以編譯,但因有錯誤所以沒辦法執行。
 15.只好把錯誤訊息變成警告,讀者若有更好的辦法,請告訴敏哥。
 16.執行結果
後記:
文子提供的畫面

另外文子測試結果
使用android-ndk-r8b版本在同一支程式中沒有蟲出現,以下是我測試環境:
Win7 SP1
Eclipse 3.7.2
Java 1.6.0_35
JDT 20.0.3
NDK r8b
另外,跟敏哥部落格文章差別在Paths and Symbol設定路徑(這是自動帶出來的):
C:\cygwin\android-ndk-r8b\sources\android\cpufeatures

C:\cygwin\android-ndk-r8b\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.6.x-google\include

C:\cygwin\android-ndk-r8b\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.6.x-google\include-fixed

C:\cygwin\android-ndk-r8b\platforms\android-14\arch-arm\usr\include

敏哥也按照文子建議,重新下載NDK r8b,結果還是一樣,不過我使用的環境是XP。

[ Android NEON ] 測試 Android NDK 提供的 NEON 程式範例

在Android NDK中有提供一支範例,來介紹NEON的使用,以下是測試的結果。

使用AVD SDK 4.03版測試,有支援ARMv7 CPU。這個測試有違背常理,理論上要比較快,是不是因為採用模擬的結果,使得結果相反。

 使用AVD SDK 2.2版測試,沒有支援ARMv7 CPU。
 使用三星平板GalaxyTab P7510 10.1",CPU不支援,有點失望。
使用HTC Desire HD,測試結果很不錯。
長高設備 210L,測試結果還不錯
 長高 6410XP因為是ARM11不支援NEON
asus nexus測試結果 


2012年6月29日 星期五

新版第一支Android程式(Android SDK r20) -- HelloWorld 包含 NDK Plugin


每年的Google I/O大會都會帶一些新的震撼出來,今年也不例外除了Android 4.1(Jelly Bean,果凍糖),Nexus 7,Nexus Q..外最主要因應Android 4.1在SDK Tools部分發佈了r20版本,由於初次使用感覺上跟以前的操作介面改變了許多故在部落格上整理分享一下。

2012年5月2日 星期三

在 Ubuntu 12.04 LTS 安裝 Android SDK&NDK 開發環境


Ubuntu「友幫拓」每年在4月及10月時會固定發布新版本,上月底 Ubuntu 發布了代號 Precise Pangolin(精確的穿山甲)的 12.04 LTS版本,這個版本官方網站將維護到 2017 年。
因此,近期將自己的 Ubuntu 開發環境也升級到 12.04,也將過程紀錄下來分享。

2012年4月19日 星期四

Java Native Interface (JNI) Android C呼叫Java (底層呼叫上層)間傳遞篇--以靜態或動態類型為例


在"Java Native Interface (JNI)入門 -- 觀念篇"這篇文章中實作二C呼叫JAVA部份說明當 C 呼叫 Java 需要建立一個  JVM 通道,然後透過Get----MethodID 搭配 Call----MethodID獲取JAVA中的指定參數。
本篇學習重點在於如何在Android NDK中由C呼叫Java。

 C呼叫Java會遇到的機會通常在於Java程式比C好寫清況或是將舊有C程式的移植時發生。
執行情況大致下列兩種:
 1.Java 進入C後,C再回到Java 呼叫函數。
 2.Java 進入C; C產生thread然後由這個thread回到Java 呼叫函數。

2012年2月27日 星期一

Java Native Interface (JNI) Android C程式間傳遞篇--以two-libs為例

今天討論簡單一點的NDK,主題就是在兩個C語言透過 h 檔案進行溝通。
在C語言中 h 檔除了可以讓程式更有結構及維護性外,在Android使用中你可以將C原始檔編譯成 library檔,然後把library檔及標頭檔(h檔)提供給需要的人,這樣同時可以讓其他人使用;亦可保有原始碼程式不被人看到,這種情況經常在呼叫硬體時為避免其他廠商從原始碼抄襲硬體而做的保護方式之一。
由於程式碼可以在..\android-ndk-r7b\samples\two-libs目錄可以看到所以這次就不貼程式碼,整個執行的架構如下圖所示:

2011年8月16日 星期二

Java Native Interface (JNI) Android C++語言篇--以Hello-JNI為例

在Hello-JNI的例子中我們可以看到在螢幕show出的指令C語言寫法如下:
return (*env)->NewStringUTF(env, "Hello from JNI !");

然而我們使用Hello-JNI的程式改成C++語言,此時寫法就會變成下面的寫法:
return env->NewStringUTF( (char *)"Hello from JNI!");

接著將
1.檔名改 hello-jni.cpp
2.修改 Android.mk 中 LOCAL_SRC_FILES := hello-jni.cpp
3.使用ndk-build編譯 (可以順利編譯完成)
再用手機或模擬器執行,然後可以發現程式發生錯誤 ?!! Why??不是說NDK支援C/C++嗎??

2011年6月1日 星期三

Java Native Interface (JNI) Android算數篇(使用NDK) -- Fibonacci Sequence

籠子裡有一對新生的兔子。假設每對兔子每個月會生出一對兔子,但新生的兔子要滿兩個月才能生出下一代兔子,則一年之後,會有多少對兔子?


費波那西數列(Fibonacci Sequence),又譯費波拿契數、斐波那契數列、費氏數列、黃金分割數列。
費波那西數列由 0 和 1 開始,之後的費波那西係數就由之前的兩數相加。
前幾個費波那西係數是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,………………

大家放心,今天不是來討論數學況且數學不太認識我,這次是將Fibonacci用JNI方式實作在Android上。

2011年5月18日 星期三

Java Native Interface (JNI) 的使用時機及影響

JNI的使用時機及影響

上篇的實作後,整理一下JNI的使用時機及影響:

什麼時機下應該使用JNI
下面提出幾個項目避免使用JNI:
1、JAVA程式和本地程式使用TCP/IP或者IPC。
2、當用JAVA程式連接本地資料庫時,使用JDBC提供的API。
3、JAVA程式可以使用分散式物件技術,如JAVA IDL API。
上述三項共同點是JAVA和C 處於不同的執行緒,或者不同的機器上。這樣當C程式部分異常時,會影響到JAVA程式。

接著那何時需要使用JNI呢? 下列情況是在同一進程內無法避免JNI的使用:
1、程式當中使用到了JAVA API 沒有提供的特殊系統環境加上使用跨進程操無法不現實情況下,如與硬體進行通訊時。
2、想使用一些已經有的本地庫(native library),但又不想付出跨進程調用時的延宕(overhead),如效率,記憶體,資料傳遞方面。
3、JAVA程式當中的一部分代碼對效率要求非常高,如演算法計算,繪圖等。
總之,只有當你必須在同一進程中調用本地代碼(nativecode)時,建議使用JNI。

JNI的副作用:
1、程式失去跨平臺。如想跨平臺在不同的系統環境下須重新編譯C語言部分。
2、影響程式的穩定,本地代碼的不當使用可能導致整個程式損壞或當掉。
通用規則是應該讓本地方法集中在少數幾個類(class)中,減少JAVA和C之間的通訊。

以上詳細內容出至The Java™ Native Interface Programmer's Guide and Specification;請參閱:
1.3 Implications of Using the JNI
1.4 When to Use the JNI

2011年5月16日 星期一

Java Native Interface (JNI) Android實戰篇(使用NDK) -- HelloUart

經過Java Native Interface (JNI)入門 -- 觀念篇Java Native Interface (JNI) 實戰篇後,延續著前兩篇的觀念第三篇繼續討論在Android上實作,本篇主要學習目的是在Android上實現針對UART的傳輸題目就沿用Hello系列稱為HelloUart。

2011年4月11日 星期一

Java Native Interface (JNI) 實戰篇

上一篇觀念篇中在PC上的Ubuntu系統中,學習了JAVA呼叫C的方法,本篇就來寫一個透過com port讀取GPS座標的實作,下圖是這次實作的環境。

Java Native Interface (JNI)入門 -- 觀念篇

眾所皆知,Java是一種可以跨平台的程式語言,而JNI是可以讓Java applications跟用其它語言(諸如C,C++)寫成的應用程式或程式庫互相呼叫使用。
JNI技術的出現主要基於三個方面的應用需求:
A.解決效能問題。
B.解決周邊硬體介面呼叫問題或解決標準JAVA預設函式庫中支援你的應用程式所需的平台相關的功能。。
C.可沿用已開發過的C語言,不須重複開發移植到Java系統。

2010年6月14日 星期一

第一支Android NDK程式--HelloJni

這篇文章主要目的是Android NDK的HelloWorld從安裝到結果。
目前最新版的NDK是Android NDK, r4,所使用的windows XP/7的環境。
NDK主要是Android Native開發工具(JNI的開發),可以使Dalvik virtual machine內執行的JAVA程式與C/C++語言溝通。
要先了解何謂NDK可以先去android developer找一篇What is the Android NDK?