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?

步驟1:安裝Cygwin
目前的版本是Cygwin 1.7.5,安裝方法:
先到 http://cygwin.com/ 網站看到右方靠上面有一個"Install or update Cygwin now! " 下載 setup.exe
執行setup.exe在Choose A Download Source畫面選擇Install from Internet,接著安裝目錄就選擇預設的就好,
然後在Choose A Download Site畫面選擇一個可用的下載網頁,在這我選擇的是ftp://ftp.ntu.edu.tw ;
接著 select packages的畫面,因為我們使用的是編譯C的工具,最簡單的安裝方式就是找到Devel選擇裡面的gcc (或gcc4;兩者選其一即可) 及 make選項如下圖所示

接著安裝完成後,檢查一下gcc與make是否可以正確執行。



步驟2:安裝NDK
首先下載Windows版本的Android NDK, r4
http://developer.android.com/intl/zh-TW/sdk/ndk/index.html
解壓縮至C:\cygwin目錄下,解壓縮完成後到C:\cygwin目錄下會看到如下畫面:

然後到C:\cygwin\home\"使用者名稱" 目錄下,用windows編輯器編輯.bash_profile :
1.在最後一行後加入下面四行,然後存檔:
PATH=/android-ndk-r4:${PATH}
NDK_ROOT=/android-ndk-r4
NDK_Sample=/android-ndk-r4/samples
export PATH NDK_ROOT NDK_Sample
如下圖所示:
(NDK_Sample是指定你的JNI程式所要放置的目錄,這邊我我指定到/android-ndk-r4/samples,這個參數會在Eclipse的C編譯中使用到。)

開啟Cygwin Bash Shell
到/android-ndk-r4/samples/hello-jni/目錄下,執行 ndk-build 見到如下圖一樣的結果表示您的NDK已經安裝完成並正確無誤產生 libhello-jni.so。


步驟3:安裝Eclipse CDT(C/C++ Development Tool)
安裝CDT很簡單,在Eclipse中Help --> Install New Software... --> Add... --> in "Archive...", 輸入CDT安裝及更新的URL位置 : http://download.eclipse.org/tools/cdt/releases/galileo
如下圖:

安裝下列套件:
• Eclipse C/C++ Development Tools
• CDT GNU Toolchain Build Support
• CDT GNU Toolchain Debug Support
• CDT Utilities
• Eclipse C/C++ Development Platform

安裝完成後,Eclipse會要求重新開啟Eclipse,重開Eclipse後看到下面圖示表示安裝完成,便可以在Eclipse中編輯C/C++程式。


步驟4:Hello-JNI
新增一個 Android專案,在Contents選項中選擇 Create project from existing source
在Location中選擇 C:\cygwin\android-ndk-r4\samples\hello-jni ,此時會自動帶出Project name為HelloJni,
接著Build Target 選擇Android 1.5然後按Finish,如下圖所示:

此時,Eclipse左邊的Package資訊如下圖:
如果第二步驟有執行過 ndk-build的話就會有libs路徑出現。

接著設定C編譯部分:
在專案名稱(HelloJNI)按滑鼠右鍵選擇Properties --> Builders --> New--> 選擇 Program
在Main標籤內容中:
Name中輸入: Native_Builder
Location中輸入: C:\cygwin\bin\bash.exe
Working Directory中輸入: C:\cygwin\bin
Arguments中輸入: --login -c "cd $NDK_Sample/hello-jni && ndk-build"
如下圖所示:
($NDK_Sample的大小寫一定要與 C:\cygwin\home\"使用者名稱"\.bash_profile 內容中大小寫一樣,這裡後面所帶的目錄就是這支JNI的目錄(hello-jni)所在,每個不同的程式都應該會有不同的目錄以實際情況為準。)

在Refresh標籤內容中:
將 Refresh resources upon completion 打勾
選擇 Specific resources
然後點選 Specify Resource 將 HelloJni下的libs路徑打勾
如下面圖所示:


在Build Options標籤內容中:
將Allocate Console打勾
將Launch in background打勾
在Run the builder:下
將After"Clean"打勾
將During manual builds打勾
將During auto builds打勾
將Specify working set of relevant resources打勾,再點選Specify Resources將 HelloJni下的jni路徑打勾
如下面圖所示:


按Apply --> OK -->OK ,將會再Eclipse的Console畫面看到如下圖資訊代表設定完成。
此時,設定正確的話可以打開hello-jni.c修改一下內容然後存檔,你將會在Console畫面看到JNI的程式重新被編譯的過程。

最後執行專案後,在模擬器的畫面就會出現如下圖:

至此,就完成了一個Hello-JNI的程式了。
補充:
1.Cygwin 在 Windows 作業系統上建立一個類似 Linux 的環境, 執行 Lnix 的指令及眾多的應用程式.
2.新版的NDK已經沒有host-setup.sh,make的方式也改成在欲編譯目錄下執行ndk-build ,這支程式會自動幫你完成程式的編譯。
3.因為Eclipse並沒有完全整合Android NDK的環境,所以執行時如果 *.so 編譯的不如預期或是出現修改前結果,建議執行第二步驟最後ndk-build那部分應該就可以解決了。

===========12/14補充========================================
android-ndk-r5版本我前幾天試過,安裝方式如同文章所述內容,只要將文章中android-ndk-r4的部分全部改成android-ndk-r5這樣就可以了。


===========延伸閱讀========================================

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

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

Java Native Interface (JNI) 實戰篇

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

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

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

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

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

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

Android NDK Beginner’s Guide


===========相關閱讀========================================
在 Ubuntu 12.04 LTS 安裝 Android SDK&NDK 開發環境

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

72 則留言:

  1. 請教大大 我是新手...

    用r4b,在 /android-ndk-r4b/samples/hello-jni/目錄下
    不能 執行 ndk-build

    回應是no command found

    回覆刪除
  2. 請問樓上大大是怎解決的@@

    回覆刪除
  3. 先檢查一下是否是路徑的問題,例如:PATH=/android-ndk-r4:${PATH}中的android-ndk-r4如果是用新版本的話就要改成新版本的路徑。所以如果在複製貼上前確認所有目錄路徑是否與目前路徑是一致的。

    回覆刪除
  4. 你好 我進入 bash shell後 都會顯示

    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: /home/0291/.bash_profile: line 46: syntax error: unexpected end of file

    並且會產生跟"Cheng Min"一樣的錯誤 請問是什麼問題 我路徑都改成r4b了

    回覆刪除
  5. TO:筱珊
    如果你那邊也是同樣問題的話,能把你的.bash_profile貼出來看一下嗎?

    回覆刪除
  6. 各位在編輯bash_profile時
    最好用筆記本開來編輯
    用wordpad或其他的會發生錯誤

    回覆刪除
  7. 我在設定完HelloJNI的Properties 之後出現這樣的問題
    /usr/bin/bash: line 0: cd: /android-ndk-r4b/samples
    /hello-jni: No such file or directory

    可以幫我解答一下嗎

    回覆刪除
  8. TO陳:
    1.首先你所使用的是WIN還是Linux?你要確定一下你的bash路徑,我覺得應該不會再/usr/bin下面,所以程式找不到BASH ^_^||
    2.另外你的 .profile 檢查一下是否加入 PATH、 NDK_ROOT 、NDK_Sample
    以上兩個部分你先檢查看看,其相關內容在本文中有說明。

    回覆刪除
  9. 關於出現類似下面錯誤訊息時:
    /usr/bin/bash: line 0: cd: android-ndk-r4b/samples/hello-jni: No such file or directory

    發生原因是NDK_Sample在等於後面的路徑設定錯誤,以上面的訊息來看錯誤的地方在等於的後面了一個 /
    應該改:
    NDK_Sample=android-ndk-r4b/samples
    成為
    NDK_Sample=/android-ndk-r4b/samples
    應該就可以解了!
    另外NDK_Sample等於後面的路徑設定要按照自己的JNI程式所在路徑,並不是一定會是/android-ndk-r4b/samples,這部分要稍微注意一下。

    回覆刪除
  10. 請問打開hello-jin.c
    #include
    #include
    會出現
    Unresolved inclusion:
    Unresolved inclusion:
    要怎麼解決呢?
    另外如果我再開一個HelloNeon的專案需要再建一個新的builder嗎?可以設在同一個builder?
    謝謝!

    回覆刪除
  11. 由於目前我尚未遇到您所講的問題,但我猜測應該是該*.h檔應該是找不到的關係,您先查看看 include 後面所帶的 *.h 是否有在您的Cygwin系統中,也就是用find找找看,如果沒有的話把它安裝起來(libgcc),如果有則帶路徑(/lib/gcc or /usr/lib/gcc)試試看。

    回覆刪除
  12. 忘了回覆到:
    關於Builders部分,每個專案都要執行一次,主要是如我文章中所述因為Eclipse跟NDK尚未整合完整的關係。

    回覆刪除
  13. 您好! 我只有找到basic_string.h
    請問是cygwin少裝了什麼嗎?我是依照您圖裡的勾選的。
    出現錯誤訊息的是string.h 跟jni.h 可是修改hello-jni.h存檔後,可在Console畫面看到JNI的程式重新被編譯,也無錯誤訊息。另外因為我是新入門,想請教如果從google soure project 下載 http://android.git.kernel.org/?p=platform/system/wlan/broadcom.git;a=summary
    要如何以Jni來呼叫使用呢? 謝謝

    回覆刪除
  14. 我的string.h搜尋結果是放在android-ndk-r4b目錄下,你試試看加上路徑,錯誤應該是C語言在編譯時找不到*.h的問題。
    至於從google soure project 下載下來的project,這部分我也沒做過,不過您可以將下載下來的函式庫它視為C語言去呼叫或include近來您所要的函式庫的方式來做。
    所以目前看來出現的錯誤應該屬於C語言的部分,您可以朝向C的部份去解。
    下面網址有類似您發生問題的解決方式,您可以參考看看:
    http://yuanfarn.blogspot.com/2009/09/ubuntu-eclipse-gtk.html

    回覆刪除
  15. 作者已經移除這則留言。

    回覆刪除
  16. 你好 我按照你的方法
    我的系統是 vista
    ndk-r4

    我在 執行 ndk-build時 出現了錯誤
    錯誤內容如下圖(絕對沒有毒):
    http://lyaya.files.wordpress.com/2010/06/error1.jpg

    拜託幫我看一下
    萬分感激 @@"

    回覆刪除
  17. To:Lyaya
    從您的錯誤訊息看來您用的不是Cygwin自己的gcc,您好像使用的是arm的gcc,試試按照文中步驟一的方法安裝Linux gcc應該可以解你的問題。

    回覆刪除
  18. 您好~~ 我想請問一下
    當我一切準備就緒 在eclipse裡
    complie時卻出現了錯誤訊息


    Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!

    我有找了一下電腦裡的dx.jar 在android-sdk-windows\platforms\android-3\tools\lib裡面是有的
    但是不知道為什麼eclipse讀不到

    想請問一下大大 這可能是哪裡的設定沒設好 謝謝 <(_ _)>

    回覆刪除
  19. 對了 因為我是灌android-ndk-r5 環境是win7 32-bit

    然後我剛才在MacBook上面試成功了 順利在模擬器上跑出了Hello from JNI

    雖然我還是很好奇為什麼我在windows下會失敗

    回覆刪除
  20. To:混天人
    您的問題我也沒遇過,不過從您給的訊息看來應該不是NDK部分出問題,我覺得可能是你選擇的SDK版本中沒有安裝到dx.jar,又或者該檔案損會之類的,我剛搜尋了一下的電腦dx.jar在:
    C:\Temp\Eclipse\android-sdk-windows\platform-tools\lib
    C:\Temp\Eclipse\android-sdk-windows\platforms\android-3\tools\lib
    C:\Temp\Eclipse\android-sdk-windows\platforms\android-7\tools\lib
    C:\Temp\Eclipse\android-sdk-windows\platforms\android-8\tools\lib
    你那邊再查查看你程式相對應的API Level的android-sdk-windows目錄下是否有該檔案在,要不然就得要將你的android-sdk-windows目錄刪掉從心在安裝一次試試看了。

    回覆刪除
  21. 作者已經移除這則留言。

    回覆刪除
  22. 你好 我進入 bash shell後 也會顯示

    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: /home/0291/.bash_profile: line 46: syntax error: unexpected end of file

    我的.bash_profile內容是
    PATH=/android-ndk-r5:${PATH}
    NDK_ROOT=/android-ndk-r5
    NDK_Sample=/android-ndk-r5/samples
    export PATH NDK_ROOT NDK_Sample

    我在執行ndk-build時也會出現
    no command found

    我ndk是下載r5的

    拜託專家解惑了,謝謝!

    回覆刪除
  23. 這個問題在前面回覆文中有提到解法,這是windows文字編輯器的問題,會在文字最後面加上"\r"做換行這是你在編輯所看不到的,你試試用"記事本"或editplus等其他的文字編輯器重新在一次.bas_profile應該可以解你的問題的。

    回覆刪除
  24. 您好
    我的.bash_profile內容是
    PATH=/android-ndk-r5b:${PATH}
    NDK_ROOT=/android-ndk-r5b
    NDK_Sample=/android-ndk-r5b/samples
    export PATH NDK_ROOT NDK_Sample

    一樣不能執行ndk-build
    請大家幫我一下,謝謝!

    回覆刪除
  25. 不好意思
    關於蚊子在20110118的解說
    "\r"的問題
    我嘗試用winpad、devC++編譯器、記事本和UltraEdit
    開來試試看,結果都一樣,是要在linux下才有辦法編輯嗎?
    我的NDK版本也是r5b

    回覆刪除
  26. 我是使用editplus這個編輯器編輯沒問題的,其他編輯器我就沒使用過,另外一種方式就是你在cygwin下安裝vi,這個方式我也編輯過沒問題你可以試試看^_^

    回覆刪除
  27. 按照上述可以順利安裝android-ndk-r5b

    回覆刪除
  28. 若是使用WordPad就會有'\r'的問題
    再用editplus來編輯還是無法解決
    之後使用
    cat .bash_profile | tr -d '\r' > bash_profile1
    cp bash_profile1 .bash_profile
    來解決'\r'的問題
    但郤換來no command found
    重新再用editplus來編輯就可以解決
    這又是為什麼?

    回覆刪除
  29. 剛剛Google一下,似乎使用Cygwin的話'\r'的問題不少,在Cygwin FAQs有一段這麼說著:
    Q: Mysterious errors in shell scripts, .bashrc, etc


    A: You may get mysterious messages when bash reads
    your .bashrc or .bash_profile, such as
    "\r command not found"
    (or similar). When you get rid of empty lines, the
    complaints about "\r" disappears, but probably other
    errors remain. What is going on?

    The answer may lie in the fact that a text file (also
    called ASCII file) can come in two formats:
    in DOS format or in UNIX format.
    Most editors can automatically detect the formats
    and work properly in either format.
    In the DOS format, a new line is represented by two characters:
    CR (carriage return or ASCII code 13) and LF (line feed or ASCII code 15).
    In the UNIX format, a new line is represented by only
    one character, LF. When your .bashrc file is read,
    bash thinks the extra character is the name of a command,
    hence the error message.

    In Cygwin or unix, you can convert a file INFILE in DOS format
    to a file OUTFILE in Unix format by calling:

    > tr -d '\15' < INFILE > OUTFILE

    NOTE:
    If you now compare the number of characters in INFILE and OUTFILE,
    you will see that the latter has lost the correct
    number of characters (i.e., the number of lines in INFILE):

    > wc INFILE OUTFILE

    所以,我的猜測:
    上述問題應該是檔案被改成了dos格式,而使用editplus編輯後才會變成unix格式。

    回覆刪除
  30. 補充一下另一種解決方式:
    cygwin script的 EOL部分是使用UNIX “\n", 經過Win內建編輯器編輯過後EOL會變成DOS的 "\n\r"
    另外一個方式可使用dos2unix來解,我Cygwin安裝後再/bin/dos2unix
    使用方式在Cygwin shell中執行:
    dos2unix .profile

    回覆刪除
  31. 您好
    也許跟版本有關
    灌r5b的Android
    SDK版本也可能需要更新到最新
    至少我試過全部採用最新的版本
    再用VIM編輯(我只用VIM編,其他都沒試過)
    就能成功把"\r"的error消除了

    回覆刪除
  32. 但聽說有其他方式可以不使用JNI就能利用Java直接呼叫so檔
    這個幾個網頁有人看過試過嗎?
    http://www.devdaily.com/java/java-exec-processbuilder-process-1
    http://gimite.net/en/index.php?Run%20native%20executable%20in%20Android%20App
    http://developer.android.com/reference/java/lang/ProcessBuilder.html

    回覆刪除
  33. 不好意思
    我是新手
    請教另外一個問題
    如果都是用MFC也就是windows的環境下編寫出來的DLL
    JNI也能順利呼叫嗎?
    有人知道嗎?

    回覆刪除
  34. MFC是編譯Microsoft系統的編譯器所連結相關的lib都是MS系統,應該是無法編輯成*.so檔案,如果您單純在Windows(PC)環境下執行Java的JNI是可以呼叫DLL檔案,但android是基於Linux系統如果使用在Android或Linux系統應該是不認識DLL的。

    所以一般來說Java是可以跨平台使用,但是如果是呼叫了JNI的話,JNI屬於C,C語言如果要跨平台就必須重新編譯,因此JAVA+JNI會失去跨平台的優勢。

    回覆刪除
  35. 感謝版主大大
    我懂了不少

    回覆刪除
  36. 不好意思再問個基本的問題
    如果是直接修改hello-JNI的Code
    例如
    Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
    jobject thiz )
    {
    system("./test1");
    return (*env)->NewStringUTF(env, "Hello from JNI !");
    }
    system呼叫的linux檔案,是否有成功? 我不得而知
    因為他都直接跑出字串"Hello from JNI"
    把return那一整行註解掉,在模擬器上按下執行程式後一下子,他就返回了,什麼都沒出現。如果是想呼叫其他linux檔案,這個方式正確嗎?

    回覆刪除
  37. 謝謝版主~~非常好的教學文件

    回覆刪除
  38. 作者已經移除這則留言。

    回覆刪除
  39. http://www.java-tips.org/other-api-tips/jni/simple-example-of-using-the-java-native-interface.html
    我依照上列網站的教學
    做到"javah -jni X:\....."之後
    出現了'javadoc: error - Illegal package name: "X:\...."'的問題
    想請教這該如何解決

    回覆刪除
  40. Hi,
    我的C:\cygwin\home\ 底下沒有任何檔案及目錄,.bash_profile會放在哪裡呢?
    Eric

    回覆刪除
  41. 你好,我使用eclipse 3.4.2版本,在進行安裝CDT C/C++ Development Tool時總會跳出
    Cannot complete the request. See the details.
    Unsatisfied dependency: [org.eclipse.cdt.gnu.debug.feature.group 6.0.0.201002161416]
    requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.core.variables/3.2.200
    ...
    等等的訊息,請問這該如何解決呢?

    回覆刪除
  42. To:Random Dude
    抱歉,由於3.4.x版我當時尚未入門,我所使用的環境都是3.5.2版本的Eclipse,所以您的錯誤訊息"有可能"是版本上的問題,這部分我實在也不知該如何解決。Sorry!Sorry!

    回覆刪除
  43. To:ameba
    在Linux系統下,檔案前面有一點的話系統會自動隱藏,用ls -a就會看到。

    回覆刪除
  44. To:Random Dude
    更新,剛查了一下,您可以試試看改URL位置 : http://download.eclipse.org/tools/cdt/releases/galileo
    將galileov改成你所使用的Eclipse版本名稱試試看。

    回覆刪除
  45. 寫一個JAVA寫檔就可以解決\r的問題了...附上程式碼

    File f = new File("C:\\cygwing\\home\\mouse21\\.bash_profile");
    try {
    f.createNewFile();
    FileOutputStream fout= new FileOutputStream(f);
    String s = "if [ -f \"${HOME}/.bashrc\" ] ; then \n source \"${HOME}/.bashrc\" \nfi\n"
    +"PATH=/android-ndk-r5c:${PATH}\n"
    +"NDK_ROOT=/android-ndk-r5c\n"
    +"NDK_Sample=/android-ndk-r5c/samples\n"
    +"export PATH NDK_ROOT NDK_Sample";
    fout.write(s.getBytes());
    fout.flush();
    fout.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    回覆刪除
  46. 作者已經移除這則留言。

    回覆刪除
  47. 關於
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: $'\r': command not found
    bash: /home/0291/.bash_profile: line 46: syntax error: unexpected end of file

    這問題

    我的解決方法是 把home資料夾砍掉
    再開一次cygwin 他就會從新創一個home資料夾 裡面的檔案也會重新建

    然後用notepad ++ 編輯
    就可以用了

    回覆刪除
  48. 謝謝分享教學!!!
    另外想請問一個問題
    因為我要引用其它的library在我的project中
    但是在ndk-build時, 並沒有出現任何 *.so
    這樣是正常的嗎??
    有甚麼方法可以知道我的library已經可以在project中使用了呢?

    回覆刪除
  49. 您指的"其它的library"是...C原始碼還是.so檔案呢?
    如果是.so檔案的話可以直接放到專案中libs/armeabi目錄,這部分可以不用執行ndk-build,您可以試試看。

    回覆刪除
  50. 蚊子您好^^ 謝謝您回覆。
    我的labrary 是C原始碼耶。
    如果這這樣的情況,那麼我該如何操作呢?

    回覆刪除
  51. 不能執行ndk-build的問題可參考
    http://blog.yam.com/pigfly/article/33732076

    回覆刪除
  52. 您好 我在執行畫面時 他出現了
    unfortunately, Hellojni has stopped
    請問這問題怎麼解決呢

    回覆刪除
  53. unfortunately, Hellojni has stopped
    我沒有遇過,不過網路搜尋了一下,可能要先確認libs/armeabi下有沒有lib開頭副檔名so檔案。
    http://stackoverflow.com/questions/5406759/cant-run-android-ndk-app-on-device

    回覆刪除
  54. libs/armeabi有libhellojni.so 的副檔名

    所以我想應該是沒問題的
    不曉得為何 會出現這情況
    我也是第一次碰到@@~~
    已經到最後一步了 竟然還會碰上bug= =

    回覆刪除
  55. 謝謝你耶 我已經解決了
    原因是我的jni/hellojni.c檔裡
    Java_com_android_geek_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )

    跟我的package裡的
    package com.demo.geek;

    public class HelloJni extends Activity {
    //code
    }
    demo跟android 不同 才造成這樣的錯誤

    導致執行模擬會出現unfortunately, Hellojni has stopped

    至於我是利用 LogCat 找出錯誤的
    顯示的訊息為 僅列幾個 我自己看得懂 且 應該比重要的= =

    No JNI_OnLoad found in /data/data/com.demo.geek/lib/libhellojni.so 0x41359960, skipping init

    No implementation found for native Lcom/demo/geek/HelloJni;.stringFromJNI ()Ljava/lang/String;

    java.lang.UnsatisfiedLinkError: stringFromJNI

    回覆刪除
  56. C:\cygwin\android-ndk-r7\prebuilt\windows\bin\awk.exe: can't open file /android-ndk-r7/build/awk/check-awk.awk
    source line number 1 source file /android-ndk-r7/build/awk/check-awk.awk
    context is
    >>> <<<
    Android NDK: Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk !
    /android-ndk-r7/build/core/init.mk:258: *** Android NDK: Aborting. . Stop.

    我在執行ndk-build時會出現這個問題
    請問有大大知道如何解決嗎?

    回覆刪除
  57. 從您的錯誤訊息看來應該是awk的套件沒有安裝到,您可以先試試看在Cygwin中執行awk看看是否有訊息出現。

    回覆刪除
  58. $ awk
    Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
    Usage: awk [POSIX or GNU style options] [--] 'program' file ...
    POSIX options: GNU long options: (standard)
    -f progfile --file=progfile
    -F fs --field-separator=fs
    -v var=val --assign=var=val
    Short options: GNU long options: (extensions)
    -b --characters-as-bytes
    -c --traditional
    -C --copyright
    -d[file] --dump-variables[=file]
    -e 'program-text' --source='program-text'
    -E file --exec=file
    -g --gen-pot
    -h --help
    -L [fatal] --lint[=fatal]
    -n --non-de.....................................................
    AWK有訊息
    但是仍然會有跟Yang一樣的錯誤

    回覆刪除
  59. 將awk的檔名改成awk_就可以了,我剛剛就這樣成功了!

    底下是參考連結:
    http://stackoverflow.com/questions/8116113/problems-with-android-ndk-7-and-awk/8121153#8121153

    回覆刪除
  60. PATH=/android-ndk-r7:${PATH}
    NDK_ROOT=/android-ndk-r7
    NDK_Sample=/android-ndk-r7/samples
    export PATH NDK_ROOT NDK_Sample

    你好,我已將設定按照您上述所說,但不知道還是一樣ndk-build找不到
    不能編譯,請問哪邊出問題???

    回覆刪除
  61. 想請問一下 為何我去編輯我的hello-jni的時候會出現以下錯誤呢
    謝謝
    $ ndk-build
    C:\cygwin\android-ndk-r7\prebuilt\windows\bin\awk.exe: can't open file /android-ndk-r7/build/awk/check-awk.awk
    source line number 1 source file /android-ndk-r7/build/awk/check-awk.awk
    context is
    >>> <<<
    Android NDK: Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk !
    /android-ndk-r7/build/core/init.mk:258: *** Android NDK: Aborting. . Stop.

    回覆刪除
  62. 你好
    為何看一些書上說
    需要先做靜態註冊或是動態註冊
    才能跟stringFromJni函式做聯結呢
    好像沒看到這篇文章有提到這件事

    我一直卡在
    java.lang.UnsatisfiedLinkError: stringFromJNI
    這個error上面

    回覆刪除
  63. 各位好,我安裝Android-ndk-r8e-Windows-64
    設定變數:
    PATH=/android-ndk-r8e:${PATH}
    NDK_ROOT=/android-ndk-r8e
    NDK_Sample=/android-ndk-r8e/samples
    export PATH NDK_ROOT NDK_Sample
    執行Cygwin一開始出現:
    -bash: $'\r':命令找不到
    -bash: $'\r':命令找不到
    -bash: $'\r':命令找不到
    -bash: $'\r':命令找不到
    然後出現
    -bash: /home/HUI/.bash_profile: line 49: syntax error: unexpected end of file
    請問要怎麼解決??
    麻煩各位了

    回覆刪除