Ошибка при сборке v8 во встроенном андроиде

Я попытался импортировать v8 7.6.90 как статическую библиотеку в свой проект Android NDK, но это не удалось в процессе связывания.

Вот моя конфигурация args.gn для сборки v8:

android_unstripped_runtime_outputs = true
v8_use_external_startup_data = false
is_debug = false
symbol_level = 1
target_cpu = "arm"
target_os = "android"
use_goma = false
v8_enable_i18n_support = false
v8_static_library = true
is_component_build = false
v8_monolithic = true
v8_android_log_stdout = true

Он скомпилировался и дал мне libv8_monolith.a после компиляции, тогда я начал настраивать свой проект Android.

CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)
add_library(v8 STATIC IMPORTED)
set_target_properties( v8 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libv8_monolith.a)
add_library( # Sets the name of the library.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        ${CMAKE_SOURCE_DIR}/src/main/cpp/native-lib.cpp)

target_include_directories( native-lib PRIVATE ${CMAKE_SOURCE_DIR}/libs/include)

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

target_link_libraries( # Specifies the target library.
        native-lib
        v8
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

построить.градле:

externalNativeBuild {
    cmake {
        cppFlags "-std=c++0x"
    }
}
ndk {
    abiFilters "armeabi-v7a"
}

native-lib.cpp запускает тот же пример в https://chromium.googlesource.com/v8/v8/+/master/samples/hello-world.cc

Но ld всегда жалуется на ошибку:

../../src/compiler/graph-visualizer.cc:0: error: undefined reference to 'vtable for std::__1::basic_ios<char, std::__1::char_traits<char> >'
/Users/fredguo/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function
error: undefined reference to 'v8::platform::NewDefaultPlatform(int, v8::platform::IdleTaskSupport, v8::platform::InProcessStackDumping, std::__ndk1::unique_ptr<v8::TracingController, std::__ndk1::default_delete<v8::TracingController> >)'

Я попытался сбросить свой libv8_monolith.a:

objdump -D app/libs/armeabi-v7a/libv8_monolith.a | grep NewDefault

Disassembly of section .text._ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE:
_ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE:
       4:       81 b0 01 2b     blhs    #442884 <_ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE+0x6C210>
Disassembly of section .rel.text._ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE:
.rel.text._ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE:
Disassembly of section .ARM.exidx.text._ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE:
.ARM.exidx.text._ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE:
Disassembly of section .rel.ARM.exidx.text._ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE:
.rel.ARM.exidx.text._ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE:
Disassembly of section .text._ZN2v811ArrayBuffer9Allocator19NewDefaultAllocatorEv:
_ZN2v811ArrayBuffer9Allocator19NewDefaultAllocatorEv:
Disassembly of section .rel.text._ZN2v811ArrayBuffer9Allocator19NewDefaultAllocatorEv:
.rel.text._ZN2v811ArrayBuffer9Allocator19NewDefaultAllocatorEv:
Disassembly of section .ARM.exidx.text._ZN2v811ArrayBuffer9Allocator19NewDefaultAllocatorEv:
.ARM.exidx.text._ZN2v811ArrayBuffer9Allocator19NewDefaultAllocatorEv:
Disassembly of section .rel.ARM.exidx.text._ZN2v811ArrayBuffer9Allocator19NewDefaultAllocatorEv:
.rel.ARM.exidx.text._ZN2v811ArrayBuffer9Allocator19NewDefaultAllocatorEv:

_ZN2v88platform18NewDefaultPlatformEiNS0_15IdleTaskSupportENS0_21InProcessStackDumpingENSt3__110unique_ptrINS_17TracingControllerENS3_14default_deleteIS5_EEEE

должно быть

v8::platform::NewDefaultPlatform(int, v8::platform::IdleTaskSupport, v8::platform::InProcessStackDumping, std::__1::unique_ptr<v8::TracingController, std::__1::default_delete<v8::TracingController> >)

Однако в сообщении об ошибке ld пытается найти std::__ndk1::unique_ptr<v8::TracingController, std::__ndk1::default_delete<v8::TracingController> >)

Я думаю, что у них другое пространство имен, но как мне решить эту проблему? Я нашел похожую проблему здесь https://groups.google.com/forum/#!topic/v8-users/Jb1VSouy2Z0, но решение мне не помогло.

Я считаю, что добавление use_custom_libcxx=false к args.gn решит проблему, см. Как использовать связанные библиотеки, скомпилированные с помощью libc++ libstdc++mixed

Alex Cohn 28.05.2019 21:54

Я также сталкиваюсь с подобной проблемой. Я пробовал использовать флаг use_custom_libcxx=false, но это мне не помогло. Любое решение? Вот мой журнал ошибок. SampleNDK/app/src/main/cpp/hello-jni.cpp:42: ошибка: неопределенная ссылка на 'v8::platform::NewDefaultPlatform(int, v8::platform::IdleTaskSupport, v8::platform::InProcessStackDumping, std::__ndk1::unique_ptr >)' ../../buildtools/ Third_Party/libc++/trunk/include/memory:358‌​6: ошибка: неопределенная ссылка на 'std::__1::__shared_weak_count::__release_weak() '

Shanker 12.08.2019 14:37

@BABASHANKER Я следил за документацией, мне удалось понизить версию до 7.2 и скомпилировать. Но я не нашел удачи выше 7.2. Вот мой args.gn в 7.2: is_debug = true target_cpu = "arm" target_os = "android" v8_android_log_stdout = false is_component_build = false android_unstripped_runtime_outputs = false v8_enable_backtrace = true v8_enable_slow_dchecks = true v8_optimized_debug = false use_goma = false v8_monolithic = true v8_use_external_startup_data = false P.S. Я не знаю, как сделать новую строку в комментарии, извините за неправильный формат :P

Jian Guo 13.08.2019 10:12
2
3
1 132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте изменить макрос пространства имен в v8/buildtools/third_party/libc++/trunk/include/__config:

от _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION) до _LIBCPP_CONCAT(__ndk,_LIBCPP_ABI_VERSION).

Надеюсь это поможет.

Это правильный ответ. Мне пришлось сделать это для некоторых версий v8 7.2+ и v8 8.0.

hyperandroid 20.12.2019 14:22

Другие вопросы по теме