android之ndk開發,androidndk

來源:互聯網
上載者:User

android之ndk開發,androidndk
準備工作
1.下載安裝Android NDK

 地址:http://developer.android.com/sdk/ndk/index.html
    配置NDK環境變數,如:
    NDK_HOME    C:\android-ndk-r9
    PATH        %NDK_HOME%


2.下載安裝cygwin

 在window平台下,你要先搭建一個linux環境, cygwin是一個在windows平台上啟動並執行unix類比環境,它對於學習       unix/linux作業環境,或者從unix到windows的應用程式移植,非常有用。通過它,你就可以在不安裝linux的情況下使用NDK來編譯C、C++代碼了。
    :http://www.cygwin.com
    安裝過程中在選擇Select Packages時,只需選
    Devel: Install
    Shells:Install

    運行cygwin,在彈出的命令列視窗輸入:cygcheck -c cygwin命令,會列印出當前cygwin的版本和運行狀 態,如果  status是ok的話,則cygwin運行正常。


建立樣本工程

//MainActivity.javapublic class MainActivity extends Activity {// 1.定義一個c方法介面,相當於在java代碼中定義一個介面private native String helloworldfromC();// 5.在java代碼中引入函數庫static{System.loadLibrary("hello"); // 注意:去掉前面的lib,和後面的.so}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void click(View view){Toast.makeText(this, helloworldfromC(), Toast.LENGTH_SHORT).show();}}

工程下建立jni檔案夾
檔案夾內添加C檔案和android.mk檔案

// Hello.c#include <stdio.h>#include <jni.h>// android-ndk-r9\android-ndk-r9\platforms\android-8\arch-arm\usr\include// private native String helloworldfromC();jstring Java_com_android_helloworldfromc_MainActivity_helloworldfromC(JNIEnv* env, jobject obj){// 2.實現c代碼// 返回一個java的String// jstring     (*NewStringUTF)(JNIEnv*, const char*);// (*env) 相當於JNINativeInterface* JNIEnv// return (**env).NewStringUTF(env,"helloworldfromc");return (*env)->NewStringUTF(env,"helloworldfromc");// 產生mk檔案// android.mk 告訴編譯器如何把c代碼打包成函數庫// 3.把c代碼打包成函數庫}

android.mk 如下

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# 打包成函數庫的名字LOCAL_MODULE    := hello# 對應c代碼檔案LOCAL_SRC_FILES := Hello.cinclude $(BUILD_SHARED_LIBRARY)

編譯c代碼
cd 工程目錄/
ndk-build
沒有錯誤發生即是通過


運行程式注意: ndk工程只能運行於arm架構的模擬器


C檔案中函數名的命名規範,如:
jstring   Java_com_android_helloworldfromc_MainActivity_helloworldfromC

返回值  Java_包名_類名_定義的c方法介面


這裡也可以通過javah 自動產生標頭檔, 就不用自己寫方法名
jdk 版本為1.6時
cd   工程目錄\bin\classes
javah -classpath . com.android.helloworldfromc.MainActivity
注意: 這裡務必標明路徑為目前的目錄, 否則會出現找不到類的錯誤
因為它是通過相對路徑找到你的類檔案,如上,相對路徑為:
.\com\anroid\hellowordfromc\MainActivity.java

所以,你也可以這樣寫
cd   工程目錄\bin
javah -classpath .\classes com.android.helloworldfromc.MainActivity
會在bin目錄內產生相應標頭檔

jdk 版本為1.7時
cd   工程目錄\src
javah com.android.helloworldfromc.MainActivity


jni 常見的錯誤
    1 錯誤1  忘記方法的參數
    2 錯誤2  E/AndroidRuntime(821): java.lang.UnsatisfiedLinkError: Native method not found: com.example.error.DemoActivity.helloWorld:()Ljava/lang/String;
    3 錯誤3  一般沒有日誌列印 直接報錯工程停止  一般c代碼有運行錯誤
    4 錯誤4  在交叉編譯的工具鏈上報錯  c代碼有編譯錯誤  比如 一些函數沒有聲明  一些類型沒有聲明  少符號
    5 錯誤5  沒有Android.mk 檔案
    6 錯誤6  Android.mk 檔案有錯
    7 錯誤7  引用別人.so 函數庫  需要你自己native方法對應類的包名 和之前打包成.so函數庫的包名一致


樣本工程下載


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.