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函數庫的包名一致
樣本工程下載