NDK開發_cwin配置+程式設計簡單步驟
最近在除錯 車輛識別demo,說實話,雖然最初接觸jni的時候,是在eclipse工程中進行開發的,不過後面遇到的專案都是直接放到了android 原始碼中編譯的,所以對於在eclipse中的ndk開發,其實記憶有點模糊了,包括 Android.mk的編寫,都有點小區別吧。
這裡簡單記錄下,權當簡單回顧吧。
===========================================================================================
一、需要準備和安裝 的東東
1>cygwin cygwin還是蠻強大的,相當於是在window環境上,提供了個 unix操作的環境吧。後面在window上編譯 so還得靠它;
2>android-ndk-*** ,這個的版本很多,也不清楚目前最新的版本是多少了,不過都沒有太大的關係,我使用的 android-ndk-r8b,這個是提供了編譯 so需要的工具,而且也提供了些 jni 的sample;
cygwin 的安裝就有點坑了,如果是選擇 從網路上下載安裝,也不清楚是哪個網址能成功下載的,估計得翻牆才行;不過之前安裝的時候,的確是選擇 網路安裝,也能成功安裝,只是忘了選擇哪個網址了,這次也試了很多了網點,不過不是網速太慢,就是中途有報錯了。
所以後面選擇的是本地安裝了,還好之前安裝過一次成功的,這次本地安裝完後,直接把之前安裝好的 bin目錄,直接替換現在安裝的bin目錄,然後需要安裝的一些東西就不會缺少了。
二、cygwin 的簡單使用
1>簡單對映下硬碟,方便後面的操作,如下圖,後面直接 cd win_c,就是切換到 c盤啦
2>配置下 ndk路徑,在 .bashrc 中新增 如圖所示內容,相應的ndk路徑根據自己自己實際情況而定,我這邊是直接放在了 d盤
3>配好了環境,當然是需要 source 一下啦
4>完成了上面幾步,我們就來看下有沒有生效啦,ndk提供的demo就派上用場了,切換到 ndk 的samples目錄,我這裡測的是hello-jni,
切到hello_jni 目錄下後,ndk-build 下。(我這裡可能有點問題,雖然install 成功了,後面copy到libs/armeabi的時候出錯了,不過這絲毫不影響我們後面實際專案的使用,只要install沒報錯就ok了)
三、編譯 車輛識別專案 jni
前面的工作做好了,現在就可以來編編我們的專案了,切到專案工程 的jni目錄下(一般jni相關的都放在了jni目錄下,當然這個目錄視自己實際情況而定),
然後很簡單的ndk-build 下下,ok,需要的so 成功生成了,我們可以看到 這時會在工程的 libs/armerbi下生成了我們需要的so。
========= JNI 程式設計 最最簡單步驟=====================================================================
本地時間 19:02,而且是週六,其實不想寫了,不過又想想不能偷懶,所以還是接著簡單寫下下~
1>javah + native 類路徑,生成相應的 .h檔案
2>根據 .h 檔案,新建對應的 .cpp檔案,並實現相應的方法
3>javap -s + native類路徑,檢視java 方法簽名。(個人覺得這個還是挺好用的,不過也只有在 我們的jni需要放到 android 原始碼中編譯的時候,需要寫 方法對映 的時候才用的上)
2017-1-11
=======================================================================================
前面說的是調通別人提供的demo,這在將demo的功能移值到實際專案中的時候,還是遇到了點問題。首先就是新建了native 類,重新 生成so的問題。
【遇到的問題】
1、javah +native 類名,提示找不到 類 Bitmap
找不到Bitmap,那就是android.jar 沒找到,ok, -classpath 指定下android.jar路徑
這時報錯 找不到“com.visdom.lprtest.LPR”了,
原來完整的用法應該是如下圖所示,除了指定需要的jar,還需要指定當前路徑,不過同樣的寫法在cmd中輸入是可以的,在cygwin中就報錯了,原因不詳。
不過這樣能生成 .h就可以了,不影響下一步的進行了。(這裡得說明下,如果寫的native方法,不需要import其他類的話,直接 javah + native類就可以生成 .h了)
下面再相對應的修改下 jni目錄下的Android.mk 需要編譯的檔案,就可以在cygwin中切到該jni目錄下,ndk-build了
好了,下面就可以看到在armeabi目錄下生成我們需要的libLPRJNI.so了
--------------------
2、安裝apk後,切到 data/data/包名/libs 目錄下,發現沒有 .so檔案???
這個問題就得說下 adb push 和 adb install 的區別了,如果直接adb push 到安裝目錄的話,libs目錄下是不會有so檔案的,如果是 adb install的話,則是有的。
而我除錯的,因為簽名關係,只能採用 adb push的方式,這種情況下,需要載入的so就需要手動的push 到system/lib目錄下了。