[Android] 在Windows 開發環境中,開發NDK (3)
2013-02-21
在Windows 開發環境中,開發NDK (2) 這篇文章,我們寫了一個 native 的 function NDKEcho
但是尚未實作,接下來,我們要如何繼續呢?
首先,我們先在專案下面建立一個檔案夾為jni
再來切換到命令提示字元,並且切換到專案路徑
我的電腦專案路徑為 C:\Users\no2on\Documents\AndroidProjects\NdkEchoSample
之後下一個指令
javah -jni -classpath bin/classes/ -d jni/ com.donma.ndkechosample.BaseLib
看起來沒什麼錯..看看專案結構
Refresh jni 檔案夾之後發現 裡面多一個檔案 com_donma_ndkechosample_BaseLib.h
大致上會長這樣,接下我們要開一個新檔案 com_donma_ndkechosample_BaseLib.c 來實作function
這時候我們在 jni 下面新增一個檔案,為 com_donma_ndkechosample_BaseLib.c
其內容為
com_donma_ndkechosample_BaseLib.c Code :
#include <string.h>
#include "com_donma_ndkechosample_BaseLib.h"
JNIEXPORT jstring JNICALL Java_com_donma_ndkechosample_BaseLib_NDKEcho(
JNIEnv * env, jclass clazz, jstring str) {
//將jstring 轉 char *
const char *source = (*env)->GetStringUTFChars(env, str, NULL);
char msg[40];
strcpy(msg,source);
strcat(msg," by C++");
puts(msg);
//轉回Java String
jstring result;
result = (*env)->NewStringUTF(env, msg);
return result;
}
因為測試,所以寫很簡單,再來,我們需要建立NDK 編譯mk 檔
依然在 jni 檔案夾下面 新增一個 名為 Android.mk 的檔案 其內容為
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := com_donma_ndkechosample_BaseLib
LOCAL_SRC_FILES := com_donma_ndkechosample_BaseLib.c
include $(BUILD_SHARED_LIBRARY)
請注意, LOCAL_MODULE 以及 LOCAL_SRC_FILES 跟你的檔案跟package 有關,請小心設定
接下來,我們繼續回到命令提示字元,輸入 ndk-build
其中他有一個警告,這跟我設定的編譯環境有關係,所以不影響,其中你看到他輸出為.so 檔案至lib下方
多了arm 的 so 檔案,當然如果你需要編譯其他平台可有 其他指令可以下…
看一下目錄結構
接下來我們回到 BaseLib.java 補一段 載入library
package com.donma.ndkechosample;
public class BaseLib {
public static String Echo(String src) {
return src + " by Java";
}
public native static String NDKEcho(String src);
static {
System.loadLibrary("com_donma_ndkechosample_BaseLib");
}
}
接下來就是Android Java主程式這邊的呼叫了..