정적 라이브러리를 빌드하고 * .so를 성공적으로 컴파일하기 위해 ndk-build를 사용하지만, android 시뮬레이터에서 실행될 때 런타임 오류가 발생합니다. 이 오류는java.lang.UnsatisfiedLinkError : dlopen failed : "_ZNSt6__ndk17codecvtIcc9mbstate_tE2idE"기호를 찾을 수 없습니다.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: org.example.kotlin.mixed, PID: 31185
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZNSt6__ndk17codecvtIcc9mbstate_tE2idE" referenced by "/data/app/org.example.kotlin.mixed-2/lib/x86/libtest.so"...
at java.lang.Runtime.loadLibrary(Runtime.java:372)
at java.lang.System.loadLibrary(System.java:1076)
at com.bytedance.lark.sdk.Sdk.<init>(Sdk.kt:15)
at org.example.kotlin.mixed.MyApplication.onCreate(MyApplication.kt:12)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4707)
at android.app.ActivityThread.-wrap1(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
내가 기호 _ZNSt6__ndk17codecvtIcc9mbstate_tE2idE 내가 빌드 정적 라이브러리에 나타납니다 찾을 수 있습니다. 내 소스 코드에서 ndk에 대한 참조를 찾을 수 없습니다. ndk-build가이 기호를 정적 lib에 추가하는지 확실하지 않습니다.
ndk-build config가 여기에옵니다.
Application.mk
APP_ABI := x86
APP_PLATFORM := android-21 // I change this to android-14, also not work
APP_STL:=c++_static
APP_CPPFLAGS:=-std=c++11 -fexceptions -frtti -DANDROID -DDEBUG
NDK_TOOLCHAIN_VERSION := clang
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include ../uuid/Android.mk
include mylib.mk
mylib.mk
LOCAL_PATH := $(call my-dir)
MYLIB_CSOURCES := \
// my source code
MYLIB_INCLUDES := \
$(LOCAL_PATH)/../uuid/include \
$(LOCAL_PATH)/../../../../../lib/rapidjson/include \
$(LOCAL_PATH)/../../../../../src
###
### Build mylib.a
###
include $(CLEAR_VARS)
LOCAL_MODULE := mylibc++
LOCAL_SRC_FILES := \
$(addprefix ../../../../../src/,$(MYLIB_CSOURCES))
LOCAL_C_INCLUDES := $(MYLIB_INCLUDES)
LOCAL_CFLAGS += -DANDROID -DDEBUG -D__ANDROID__
LOCAL_WHOLE_STATIC_LIBRARIES := uuid
include $(BUILD_STATIC_LIBRARY)
안드로이드 빌드 설정 :
android {
compileSdkVersion 23
buildToolsVersion '26.0.2'
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
lintOptions {
abortOnError false
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'libs'
}
}
앱에서 libtest.so를로드합니다. 그러나이 도서관은 어떻게 지어 집니까? libmylibC++를 사용합니까? –
나는 내 RUST 프로젝트에서 libtest.so를 빌드하기 위해 libmylibC++. a를 사용합니다. libmylibC++. a를 제거하면 응용 프로그램이 잘 작동하지만 libtest.so에 libmylibC++. a를 추가하면 이전에 언급 한 것처럼 응용 프로그램이 RuntimeError를 throw합니다. _ZNSt6__ndk17codecvtIcc9mbstate_tE2idE 심볼은 nmm 명령을 사용하면 libmylibC++. a에 나타납니다. – wangsijie
BTW, NDK가'-DANDROID -DDEBUG -D__ANDROID__'를 설정하면 ** LOCAL_CFLAGS **에 추가 할 필요가 없습니다. –