配置好環境後,新建一個文件夾,名字隨意,比如叫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()