mac os x 將C檔案編譯成.so庫
應用背景
將C語言寫好的程式碼提供給unity呼叫,專案要在Android手機上執行,所以要將C程式碼編譯成.so庫。因為要用到opencv對影象操作,這裡把opencvsdk也放進去了。
步驟:
1、下載安裝Android studio(其實也可以不下載,樓主為了省事,直接安裝Android studio,目的還是為了安裝ndk,sdk);
2、配置檔案
2.1 jni檔案及路徑(jni檔案下載路徑:http://download.csdn.net/detail/boy313918205/9724639)
jni路徑:/Users/xlsj/Desktop/dalaofei/MarkerLessARAndroid/jni
2.2 NDK路徑:/Users/xlsj/Desktop/dalaofei/NingBoSubway/android-ndk-r10b
這裡使用NDK是:android-ndk64-r10b-darwin-x86_64.tar
2.3 opencv sdk路徑:/Users/xlsj/Desktop/dalaofei/OpenCV-2.4.9-android-sdk
這裡下載使用的opencv是OpenCV-2.4.9-android-sdk。
一下是jni檔案中的檔案及程式碼,在步驟2中下載的jni檔案中已經包含。
3、Android.mk檔案中程式碼:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
MAIN_DIR:=$(LOCAL_PATH)
OPENCV_LIB_TYPE:=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
#try to load OpenCV.mk from default install location
include /Users/xlsj/Desktop/dalaofei/OpenCV-2.4.9-android-sdk/sdk/native/jni/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_PATH:=$(MAIN_DIR)
LOCAL_MODULE:=OpenCV
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
OpenCV_CAMERA_MODULES:=on
OpenCV_INSTALL_MODULES:=off
OpenCV_LIB_TYPE:=STATIC
include /Users/xlsj/Desktop/dalaofei/OpenCV-2.4.9-android-sdk/sdk/native/jni/OpenCV.mk
LOCAL_MODULE := MarkerLessARAndroid
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_SRC_FILES := $(LOCAL_PATH)/ARMarkerLessAndroid.cpp
LOCAL_SHARED_LIBRARIES+=OpenCV
LOCAL_LDLIBS += -llog -ldl -DNDEBUG
LOCAL_LDFLAGS += -pthread -fopenmp
LOCAL_CFLAGS += -DNDEBUG -O1 -O2 -O3 -Os -Ofast -ffunction-sections -fdata-sections -mfloat-abi=softfp -mfpu=neon
LOCAL_CPPFLAGS := -std=c++11 -pthread -frtti -fexceptions -DNDEBUG -O1 -O2 -O3 -Os -Ofast -ffunction-sections -fdata-sections -mfloat-abi=softfp -mfpu=neon -fopenmp
LOCAL_ARM_NEON := true
LOCAL_ARM_MODE := arm
include $(BUILD_SHARED_LIBRARY)
4、
Application.mk檔案中程式碼:
APP_CPPFLAGS := -frtti -fexceptions -mfloat-abi=softfp -mfpu=neon -std=gnu++0x -Wno-deprecated \
-ftree-vectorize -ffast-math -fsingle-precision-constant --std=c++11
NDK_TOOLCHAIN_VERSION := 4.9
APP_CFLAGS := --std=c++11
APP_ABI :=armeabi-v7a
APP_OPTIM := release
APP_SHORT_COMMANDS := true
APP_PLATFORM := android-19
5、
build.sh中程式碼:
#!/bin/bash
# To build a new jni .so
# and copy the file to where it should stay
FILENAME="libMarkerARAndroid.so"
PROJECT_PATH=$(dirname $(cd $(dirname ${BASH_SOURCE[0]} ); pwd ) )
DEST_PATH="/Users/xlsj/Desktop/dalaofei/MarkerLessARAndroid/jni"
NDK_PATH="/Users/xlsj/Desktop/dalaofei/NingBoSubway/android-ndk-r10b"
if [ $(basename $(pwd) ) !="jni" ];then
export NDK_PROJECT_PATH=$PROJECT_PATH
fi
${NDK_PATH}/ndk-build
if [ ! -e ${PROJECT_PATH}/libs/armeabi-v7a/${FILENAME} ];then
echo" Compile process failed, no .so file. "
echo"--------------------------------------"
else
echo" Has compiled. "
echo"---------------"
if [ -e ${DEST_PATH}/armeabi-v7a/${FILENAME} ];then
rm --preserve ${DEST_PATH}/armeabi-v7a/${FILENAME}
echo" The old jni .so has been deleted. "
echo"-------------------------------"
fi
cp ${PROJECT_PATH}/libs/armeabi-v7a/${FILENAME} ${DEST_PATH}/armeabi-v7a/${FILENAME}
fi
#${NDK_PATH}/ndk-build clean
echo" Has done and cleaned."
:<<!EOF!
!EOF!
以上程式碼中有opencv,ndk等路徑需要修改
6 在終端中執行build.sh
在蘋果主介面選單按順序:前往——>實用工具——>終端;
在終端中輸入build.sh路勁並執行。
如圖:
執行結果,jni同級目錄中生產“libs”和“obj”檔案。
將執行檔案中的.so檔案拷貝中unity中便可以實用。