Linux下使用Android的ndk工具打包so

Linux下ndk安裝和環境變量配置

配置好環境後,新建一個文件夾,名字隨意,比如叫jni,裏面放置三個文件,Android.mk  application.mk和c++的源文件

其中Android.mk代碼如下

LOCAL_PATH      := $(call my-dir)
TARGET_ARCH     := arm
TARGET_PLATFORM := android-16
include $(CLEAR_VARS)

LOCAL_CFLAGS += -D__linux__ -D__embedded__ -D__android__ -W -Wall

MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)

LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)

LOCAL_C_INCLUDES       := $(LOCAL_PATH)/../../../../include

LOCAL_MODULE           := gray2bmp
//LOCAL_MODULE_FILENAME  := gray2bmp

LOCAL_LDLIBS           := -llog
LOCAL_LDLIBS           +=-L$(SYSROOT)/usr/lib -llog

LOCAL_LDFLAGS 	    += -ljnigraphics
//LOCAL_LDFLAGS       += $(LOCAL_PATH)/iconv/libiconv.a

include $(BUILD_SHARED_LIBRARY)

$(call import-module, android/support)

Appilication.mk代碼如下

APP_MODULES = gray2bmp
//APP_ABI    := armeabi armeabi-v7a arm64-v8a x86 x86_64
APP_ABI    := armeabi-v7a arm64-v8a
//APP_STL    := stlport_shared
APP_STL    := c++_shared
APP_PLATFORM :=android-26   # 使用的ndk庫函數版本號。
ifeq ($(NDK_DEBUG), 1)
    APP_OPTIM = debug
    APP_CFLAGS = -g -O0
else
    APP_OPTIM = release
    APP_CFLAGS = -O3
endif

APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1  -std=c++0x

APP_CPPFLAGS += -fexceptions

Ctrl+Alt+T調出命令行工具,然後cd進入jni目錄,輸入ndk-build命令

出現圖示提示表示編譯成功,同時在jni同級目錄下會生成libs文件夾和obj文件夾,libs裏面的so就是可以放在AS裏面進行調用的動態庫

最後在AS裏面調用

 ndk {
            moduleName ""
            abiFilter("armeabi-v7a")  //重點是這句,
        }



 sourceSets {
        main {
            jniLibs.srcDirs = ["libs"]
            jni.srcDirs = []
        }
    }

做好這三步配置,再在MainActivity進行jni調用

 

有一點需要注意的是,如果是自己寫的CPP文件,比如

extern "C" JNIEXPORT jstring JNICALL
Java_com_cloud_dhd_sotest_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

裏面的com_cloud_dhd_sotest_MainActivity表示包名,com.cloud.dhd.sotest需要和自己使用項目的包名對應上,否則報如下錯誤

ava.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.cloud.dhd.sotest.MainActivity.stringFromJNI() 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章