轉載標明出處:http://blog.csdn.net/ikerpeng/article/details/45393223
要解決的問題:
Android代碼調用 優秀的C++代碼,高效的實現需要的功能。
總體的思路:
1. 完成 自己的Android代碼;
2. 將c++代碼生成 .so;
3. 將.so 庫放在Android 的libs文件夾當中;
4. Android代碼當中定義待調用接口函數,並導入庫。
具體的操作:
1. 完成 自己的Android代碼;
這一部分就是Android開發的事情了,不是我的重點和擅長,相信是你的擅長;
2. 將c++代碼生成 .so;
我假設你是有你需要的功能的c++代碼的。(沒有你還移植個屁啊O(∩_∩)O哈哈~)
2.1 c++代碼修改
這一部分的工作,三個重要的點:
1,頭文件加入: #include <jni.h>
2,加入 extern“c”,處理C++代碼;
3,輸出的接口函數命名一定要規範;Java_包_類_方法 (JNIEnv *, jclass,);
例子:
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jlong JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeCreateObject
(JNIEnv *, jclass, jstring, jint);
#ifdef __cplusplus
}
#endif
這裏只是頭文件,具體的實現你可以在CPP文件裏面實現;
2.2 Android.mk 文件的修改
將剛纔的源文件加進去,依賴的庫加進去。(一般來說還需要Application.mk的,但是幾乎都是一樣的,複製過去就好)
例子:
Android.mk 文件(很像Makefile文件)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#OPENCV_LIB_TYPE:=SHARED
include ../../../opencvsdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE := detection_based_tracker
include $(BUILD_SHARED_LIBRARY)
Application.mk 文件
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8
2.3 ndk-build編譯
將以上4個文件放在jni文件夾裏面,然後準備開始編譯.so文件。
只要你安裝的版本在r7 以上就可以不需要其他的插件了。非常的方便,配置好環境變量,從CMD進入到jni 文件或是它的上一級文件夾,執行ndk-build命令,開始編譯。
更加詳細的參考:http://blog.csdn.net/ikerpeng/article/details/42643223
3. 將.so 庫放在Android 的libs文件夾當中;
將剛纔編譯生成 的lib文件下下面的.so文件拷貝出來,連帶所在的文件夾(這個是必須的),放到你的Android工程裏面的libs文件夾;
4. Android代碼當中定義待調用接口函數,並導入庫。
定義好接口函數,這個函數名一定和C++中的最後那個名字一樣,然後 System.loadLibrary();導入;
就可以在Android的代碼當中代用這個函數了。
例子:
public class PedDetectionNative {
static {
System.loadLibrary("ped_detection");
}
public static native boolean ped(byte[] yuv);
}
接下來你就可以在Android的代碼裏面使用 ped()這個函數了。
轉載標明出處:http://blog.csdn.net/ikerpeng/article/details/45393223
以上完成
iker Cross
2015年 4月 30日