Android NDK開發基礎,androidndk開發

來源:互聯網
上載者:User

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標頭檔

  • javah


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相關概念
  • NDK的應用情境
    • 代碼的保護(Java代碼容易被反編譯,C/C++庫)
    • 代碼複用性:多數開源庫用C/C++編寫(如OpenCV,FFmpeg等)
    • 便於移植(在其他嵌入式平台上再次使用,如iOS)
  • 交叉編譯

    使用工具在一個平台編譯產生另一個平台可執行檔代碼。

  • JNI(Java Native Interface)

    是Java平台標準的一部分,允許Java代碼和其他語言代碼進行互動

  • 連結庫(靜態,動態)

    • 靜態連結庫
    • 動態連結程式庫
  • mk設定檔(make)參數
  • ndk開發包目錄

聯繫我們

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