1. 程式人生 > >mac os x 將C檔案編譯成.so庫

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_STL := gnustl_static
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中便可以實用。