2017-11-01 7 views
0

정적 라이브러리를 빌드하고 * .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' 
    } 
} 
+0

앱에서 libtest.so를로드합니다. 그러나이 도서관은 어떻게 지어 집니까? libmylibC++를 사용합니까? –

+0

나는 내 RUST 프로젝트에서 libtest.so를 빌드하기 위해 libmylibC++. a를 사용합니다. libmylibC++. a를 제거하면 응용 프로그램이 잘 작동하지만 libtest.so에 libmylibC++. a를 추가하면 이전에 언급 한 것처럼 응용 프로그램이 RuntimeError를 throw합니다. _ZNSt6__ndk17codecvtIcc9mbstate_tE2idE 심볼은 nmm 명령을 사용하면 libmylibC++. a에 나타납니다. – wangsijie

+0

BTW, NDK가'-DANDROID -DDEBUG -D__ANDROID__'를 설정하면 ** LOCAL_CFLAGS **에 추가 할 필요가 없습니다. –

답변

0

상징 _ZNSt6__ndk17codecvtIcc9mbstate_tE2idE (수단 표준 : __ ndk1 :: codecvt :: ID)에서 사용할 의 libC++ _ shared.so. 당신이 libtest.so 를로드하기 전에

런타임 환경 (에뮬레이터) API (21)보다 낮은 경우

, 당신 해야 명시 적으로, 자바에서이 라이브러리를로드합니다.

는 libc의 ++ _ shared.so libtest.so 과 함께 APK로 포장되어야한다. 이 파일이 libs/x86에 있고 다른 관련 ABI에도 존재하는지 확인하십시오.

Android Studio에서는 gradle에서 NDK 라이브러리를 만들 수 있으며 필요한 종속성을 처리합니다.

+0

안드로이드 프로젝트에 libC++ _ shared.so를 추가 한 후 응용 프로그램이 잘 작동합니다. 감사합니다! – wangsijie

+0

이것은 C++ _ 정적에서는 작동하지 않는 이유를 설명하지 않습니다. 아마도 libmylibC++. a는 C++ _ static과 연결되지 않은 다른 빌드에서 사용 되었습니까? –

+0

@DanAlbert 당신이 맞을 것 같네요, ** libmylibC++. **는'APP_STL = C++ _ shared'로 만들어 져야합니다. 그러나 다행스럽게도 정적 라이브러리의 경우에는 아무런 차이가 없습니다. RUST가 STL 라이브러리를 선택하도록 강제하는 법을 잘 모르겠습니다. –