Android NDK使用常見錯誤

來源:互聯網
上載者:User
文章目錄
  • Andorid NDK使用簡要的流程【來源於Android NDK文檔中的 OVERVIEW.txt】
  • 1、make:*** No rule specified and no make file found. Stop.
  • 2、make: *** No rule to make target  “XXXXXX”, needed by “ndk-app-XXXXX”. Stop.
  • 3、make: ***[XXXX]Errror  1
  • 4、程式運行時崩潰,這個時候我們需要注意以下幾個問題:
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.



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

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

這個錯誤的主要原因是:編譯C檔案為最後的so庫檔案需要2個檔案:Application.mk、Android.mk,如所示:

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

  • 檔案的相對路徑是否正確(Application.mk中的APP_PROJECT_PATH設定相對路徑),如所示:

    這些在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

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

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

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

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

JNITest.jva編譯後的檔案JNITest.class、JNITest.h,這個檔案就是我們需要的標頭檔,如所示:

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

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

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

4)        將上面的函式宣告拷貝出來,在jni檔案中建立一個*.c檔案,按照上述函數結構實現函數
,如所示:

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

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

庫檔案的載入

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.