Eclipse NDK 配置
https://www.cnblogs.com/chenjiajin/archive/2012/04/12/2444188.html
一、關於NDK:
NDK全稱:Native Development Kit。
1、NDK是一係列工具的集合。
NDK提供了一係列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。
NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員隻需要簡單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創建出so。
NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
2、NDK提供了一份穩定、功能有限的API頭文件聲明。
Google明確聲明該API是穩定的,在後續所有版本中都穩定支持當前發布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標準庫(libc)、標準數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。
二、NDK實例的實現:
對於Windows環境下NDK的開發,如果使用的NDK是r7之前的版本,必須要安裝Cygwin才能使用NDK,所以為Eclipse需要配置的builder,其實是執行Cygwin,然後傳遞ndk-build作為參數。在NDKr7開始,Google的Windows版的NDK提供了一個ndk-build.cmd的腳本,這樣,就可以直接利用這個腳本編譯,而不需要使用Cygwin了。隻需要為Eclipse Android工程添加一個Builders,就能讓Eclipse自動編譯NDK。
本文是講述NDK-r7下的實現實例。
下麵是使用NDK-r7在windows下配置自動編譯的builders的過程(實際上對於Linux,隻需要修改ndk-build.cmd為ndk-build就可以了。)。
(1)先下載安裝NDK-r7。
下載地址:https://developer.android.com/sdk/ndk/index.html
下載後解壓縮就可以用了。
(2)打開Eclipse,新建一個Android工程(我的取名為TestNdk),在工程目錄TestNdk下新建jni文件夾,該文件夾就用來保存NDK需要編譯的文件代碼等。
(3)新建並配置一個Builder:
(a)Project->Properties->Builders->New,新建一個Builder。
(b)在彈出的【Choose configuration type】對話框,選擇【Program】,點擊【OK】:
(c)在彈出的【Edit Configuration】對話框中,配置選項卡【Main】。
在“Name“中輸入新builders的名稱(我取名為Ndk_Builder)。
在“Location”中輸入nkd-build.cmd的路徑。
(我的是D:\AndroidDev\android-ndk-r7\ndk-build.cmd,根據各自的ndk路徑設置,也可以點擊“Browser File System…”來選取這個路徑)。
在“Working Diretcoty”中輸入${workspace_loc:/TestNdk}(也可以點擊“Browse Workspace”來選取TestNdk目錄)。
(d)【Edit Configuration】對話框中,配置選項卡【Refresh】。
勾選“Refresh resources upon completion”,
勾選“The entire workspace”,
勾選“Recuresively include sub-folders”。
(e)【Edit Configuration】對話框中,配置選項卡【Build options】。
勾選“After a “Clean””,
勾選“During manual builds”,
勾選“During auto builds”,
勾選“Specify working set of relevant resources”。
點擊“Specify Resources…”
勾選TestNdk工程的“jni“目錄,點擊”finish“。
點擊“OK“,完成配置。
OK,到這裏Eclipse就能夠自動調用NDK編譯jin目錄下的C/C++代碼了。
(4)在TestNdk工程中新建一個JniClient.class(為了調用C/C++代碼),其內容如下:
package com.ndk.test;
public class JniClient {
static public native String AddStr(String strA, String strB);
static public native int AddInt(int a, int b);
}
(5)用cmd命令定位到JniClient.class 所在目錄,輸入“javac JniClient.java“後回車,生成JniClinet.class文件(如果是用的Eclipse建的工程,在TestNdk\bin\classes\com\ndk\test目錄下就已經有JniClinet.class文件了)。
(6)將JniClinet.class拷貝到TestNdk\bin\classes\com\ndk\test目錄,將cmd命令定位到TestNdk\bin\classes目錄,輸入”javah com.ndk.test.JniClient“後回車,在TestNdk\bin\classes目錄下就生成了C++頭文件com_ndk_test_JniClient.h。com_ndk_test_JniClient.h的文件內容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ndk_test_JniClient */
#ifndef _Included_com_ndk_test_JniClient
#define _Included_com_ndk_test_JniClient
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ndk_test_JniClient
* Method: AddStr
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ndk_test_JniClient_AddStr
(JNIEnv *, jclass, jstring, jstring);
/*
* Class: com_ndk_test_JniClient
* Method: AddInt
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_ndk_test_JniClient_AddInt
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
(7)在jni目錄下新建一個Android.mk文件,其內容如下(詳細的語法以後再另外解釋):
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestNdk
LOCAL_SRC_FILES := com_ndk_test_JniClient.c
include $(BUILD_SHARED_LIBRARY)
(8)將com_ndk_test_JniClient.h拷貝到TestNdk工程的jni目錄下, 然後新建一個com_ndk_test_JniClient.c文件完成頭文件中函數的實現,其內容如下(本來Java_com_ndk_test_JniClient_AddStr是想完成字符串相加的功能的,但數據轉換有點問題,想先寫完本文檔,後續再研究jni數據類型的問題,所以隻簡單的返回一個字符串。):
#include "com_ndk_test_JniClient.h"
#include <stdlib.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C"
{
#endif
/*
* Class: com_ndk_test_JniClient
* Method: AddStr
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ndk_test_JniClient_AddStr
(JNIEnv *env, jclass arg, jstring instringA, jstring instringB)
{
jstring str = (*env)->NewStringUTF(env, "HelloWorld from JNI !");
return str;
}
/*
* Class: com_ndk_test_JniClient
* Method: AddInt
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_ndk_test_JniClient_AddInt
(JNIEnv *env, jclass arg, jint a, jint b)
{
return a + b;
}
#ifdef __cplusplus
}
#endif
編輯com_ndk_test_JniClient.c並保存後,可以看到TestNkd工程下的obj/local/armeabi目錄下將自動生成libTestNdk.so庫。
(9)在TestNdkActivity.java中完成對JniClient.java中函數的調用:
package com.ndk.test;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class TestNdkActivity extends Activity {
static {
System.loadLibrary("TestNdk");
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
String str = JniClient.AddStr("prefix", "suffix");
int iSum = JniClient.AddInt(5, 2);
String strSum = "5 + 7 = " + iSum;
TextView tv1 = new TextView(this);
tv1.setText(str);
setContentView(tv1);
}
}
(10)運行TestNdk工程,在模擬器中可以看到界麵輸出來自com_ndk_test_JniClient.c 文件中的“HelloWorld from JNI ! “。
OK,NDK實例到此完成。後續就可以深入的學習NDK/JNI了,比如C/C++與Java的數據類型轉換,Android.mk文件的編寫格式等。
最後更新:2017-04-04 07:03:38
上一篇:
PreferenceActivity 全接觸
下一篇:
POJ1995
Flux 是什麼?
ubuntu連接windows遠程桌麵
Mac OS X中MacPorts安裝和使用
php之分頁類代碼
Tideways和xhgui打造PHP非侵入式監控平台
物聯網時代之核心 論人工智能未來發展趨勢
視覺智能產品發布 阿裏雲這項世界第一的技術現在人人可用
《Vim實用技巧(第2版)》——第2章 普通模式 2.1停頓時請移開畫筆
Alibaba Cloud and Red Hat Join Forces to Bring Increased Flexibility with Open Source
專訪Dan Kohn:阡陌交迭,雲原生布局開源生態構建及深度應用