Android NDK使用常見錯誤

Andorid NDK使用簡要的流程【來源於Android NDK文檔中的 OVERVIEW.txt】

Here’s a very rough overview of how you can develop native code with the Android NDK:

1/ Run   build/host-setup.sh to configure the NDK
2/ Place  your native sources under $PROJECT/jni/…
3/ Write  $PROJECT/jni/Android.mk  to describe your sources to the NDK build system
4/ Write  apps/<myapp>/Application.mk to describe your application and the native sources it needs to the NDK build system
5/ Build  your native code by running “make APP=<myapp> ” in the top-level NDK directory.

The last step will copy, in case of success, the stripped shared libraries your application needs to your application’s root project directory. You will then need to generate your final .apk through the usual means.

按照上述步驟,我們說明在每一步中可能存在的錯誤【第一步,我們就不在這裏詳細說了,網上有很多不錯的文章】。

常見錯誤說明:

1、make:*** No rule specified and no make file found. Stop.

1
錯誤的原因估計是(cat : Linux命令,顯示文件的內容):工程名與Aplication.mk中的APP_MOUDLES不一致。

2

2、make: *** No rule to make target  “XXXXXX”, needed by “ndk-app-XXXXX”. Stop.

3

這個錯誤的主要原因是:編譯C文件爲最後的so庫文件需要2個文件:Application.mk、Android.mk,如下圖所示:

4

MK文件如何設置,看了上面的圖一目瞭然【詳細的說明還是要去看文檔】,以下幾點需要注意:

  • 文件的相對路徑是否正確(Application.mk中的APP_PROJECT_PATH設置相對路徑),如下圖所示:5
    這些在Android NDKzhong 都有“嚴格”規範的,在android-ndk的文檔中都有詳細說明。
  • 工程文件名 、Aplication.mk中的APP_MOUDLES 、Android.m中的LOCAL_SRC_FILES 是 否完全一致。Android.m中的LOCAL_SRC_FILES是輸出庫文件的名稱【NDK會默認的加上前綴lib(如果 LOCAL_SRC_FILES中已經是以lib開頭就不添加),以及後綴.so】,但是嘗試後發現這個地方必須與Aplication.mk中的 APP_MOUDLES一致,否則就會導致上述錯誤。

3、make: ***[XXXX]Errror  1

6

這個錯誤只要大家仔細看下就明白是C 的編譯錯誤,C 代碼無法編譯。

如何編寫C文件【native file】中的函數說明?從Java Source File推導出C/C++ Native File,可以參考以下4步:

1)        編譯java文件【Java sources:包含我們需要的native函數】 ,如下圖所示:

7

2)        使用命令javac JNITest.jva && javah JNITest ,命令運行後增加了2個文件:

8

JNITest.jva編譯後的文件JNITest.class、JNITest.h,這個文件就是我們需要的頭文件,如下圖所示:

9

3)        修改函數名 ,如何修改?我們先分析Android-NDK中的例子程序:

10

從上面的例子發現,函數名分爲4部分:13

按照上面的規則修改就可以了。

4)        將上面的函數聲明拷貝出來,在jni文件中創建一個*.c文件,按照上述函數結構實現函數 ,如下圖所示:

11

這樣我們就從Java Source File 一步一步的得到C/C++ Native File

4、程序運行時崩潰,這個時候我們需要注意以下幾個問題:

庫文件的加載

12

編譯後的so文件是libJNITest.so,而實際加載的庫文件名是: JNITest【這實際上是Unix的“規範”,在Android NDK的文檔OVERVIEW.txt中有詳細說明】;還有Linux系統區分大小寫的,所以如果上面的代碼中,將加載的庫文件名寫成jnitest,也 會導致運行崩潰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章