Android NDK開發基礎,androidndk開發
Native Development Kit下載NDK開發包
連結:http://developer.android.com/ndk/downloads/index.html
選擇NDK r10e
android-ndk-r10e-windows-x86_64.exe
自解壓檔案大小400M,解壓後3G+。
配置NDK環境變數
將ndk目錄添加到系統內容變數path,然後在新開啟的cmd輸入ndk-build驗證:
HelloJni
Eclipse安裝ADT的時候,安裝的有Android Native Development Tools,
匯入位於android-ndk-r10e\samples\hello-jni的例子到Eclipse:
初始的目錄結構:
然後開啟cmd,切換到HelloJni項目目錄:
執行ndk-build進行編譯:
完成後回到Eclipse重新整理HelloJni目錄,發現增加了obj檔案夾,裡面有各個架構對應的.so庫檔案,如:
然後運行工程:
注意到上面執行ndk-build時,編譯了很多架構,時間會長一些,如果只想編譯我們需要的arm,可以將項目jni目錄下的Application.mk檔案的以下內容進行注釋:
#APP_ABI := all
清除上次的編譯:
ndk-build clean
再次ndk-build,很快完成:
第一個NDK項目
1.建立Android項目
在MainActivity裡建立一個native方法:
public static native String getStringFromC();
2.建立jni目錄
3.編寫java層native方法
4.產生JNI標頭檔
cmd切換到項目目錄,然後執行:
javah -classpath bin/classes -d jni com.zms.hellondk.MainActivity
javah -classpath bin/classes;D:\Android\sdk\platforms\android-22\android.jar -d jni com.zms.hellondk.MainActivity
這樣比較麻煩,也可以: 添加android.jar到環境變數:D:\Android\sdk\platforms\android-22\android.jar
可以看到jni目錄下產生了.h標頭檔:
格式如下:
然後在jni目錄下建立我們自己的c檔案:
hello.c
#include<stdio.h>#include<stdlib.h>#include"com_zms_hellondk_MainActivity.h"JNIEXPORT jstring JNICALL Java_com_zms_hellondk_MainActivity_getStringFromC( JNIEnv env, jclass jclass) { return (*env)->NewStringUTF(env, "Hello from JNI !");}
然後在jni目錄下建立Android.mk檔案:
Android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := HelloNdkLOCAL_SRC_FILES := hello.c #對哪個c檔案進行編譯include $(BUILD_SHARED_LIBRARY)
然後進入cmd切換到工程目錄進行編譯:
注意,MainActivity裡要寫加上loadLibrary,引號裡是Module名,static區聲明的代碼會先於onCreate方法執行:
package com.zms.hellondk;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;public class MainActivity extends Activity { public static native String getStringFromC(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textFromJni = (TextView) findViewById(R.id.textFromJni); textFromJni.setText(getStringFromC()); } static { System.loadLibrary("HelloNdk"); }}
否則會出現以下錯誤:
(- -,不要問我是怎麼知道的)
NDK相關概念