Android的NDK连接V8静态库:无法找到符号,但它们的存在 [英] Android NDK linking V8 static library: cannot find symbols, but they are there

查看:837
本文介绍了Android的NDK连接V8静态库:无法找到符号,但它们的存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在拉我的头发在这一个。我开发在Ubuntu 12.04 64位。我创建了一个V8原生Android应用程序中嵌入它,但重新启动我的电脑后,它不会再V8联系!我试着重新安装NDK和重新编译V8,但无济于事。它出现在链接器包括静态库,但在其中没有找到的符号。我用纳米检查,该符号出现在那里。

当我运行ndk_build,我得到以下的输出:

  $ NDK的构建V = 1
RM -f ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/armeabi-v7a-hard/lib*.so ./libs/mips/lib*.so。 /libs/x86/lib*.so
RM -f ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/armeabi-v7a-hard/gdbserver ./libs/mips/gdbserver ./libs/x86/gdbserver
RM -f ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/armeabi-v7a-hard/gdb.setup ./libs/mips/gdb.setup ./libs/x86 /gdb.setup
[armeabi] ++编译大拇指:纯活性LT =的main.cpp
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/native-activity/main.od -fpic -ffunction截面-funwind桌-fstack保护器-no-canonical- prefixes -march =的ARMv5TE -mtune =的XScale -msoft浮-fno-例外-fno-RTTI -mthumb -Os -g -DNDEBUG -fomit-frame-pointer的-fno严格走样-finline限制= 64 -Ijni /包括-I /家庭/ schooten /箱/包/ Android的NDK-r9d /来源/安卓/ native_app_glue -I /家庭/ schooten /箱/包/ Android的NDK-r9d /来源/ CXX-STL /系统/包括-Ijni -DANDROID -Wa - noexecstack -Wformat -Werror =格式安全-I /家庭/ schooten /箱/包/ Android的NDK-r9d /平台/ Android的9 /弓臂/ usr / include目录-c JNI / main.cpp中 - Ø./obj/local/armeabi/objs/native-activity/main.o
[armeabi]编译大拇指:android_native_app_glue< = android_native_app_glue.c
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -MMD -MP -MF ./obj/local/armeabi/objs/android_native_app_glue/android_native_app_glue.od -fpic -ffunction截面-funwind桌-fstack保护器-no-canonical- prefixes -march =的ARMv5TE -mtune =的XScale -msoft浮动-mthumb -Os -g -DNDEBUG -fomit-frame-pointer的-fno严格走样-finline限制= 64 -I /家庭/ schooten /箱/包/ Android的NDK-r9d /来源/安卓/ native_app_glue -DANDROID -Wa, - noexecstack -Wformat -Werror =格式安全-I /家庭/ schooten /箱/包/ Android的NDK-r9d /平台/ Android的9 /弓臂/ usr / include目录-C /home/schooten/bin/packages/android-ndk-r9d/sources/android/native_app_glue/android_native_app_glue.c -o ./obj/local/armeabi/objs/android_native_app_glue/android_native_app_glue.o
[armeabi] STATICLIBRARY:libandroid_native_app_glue.a
RM -f OBJ /本地/ armeabi / libandroid_native_app_glue.a
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/arm-linux-androideabi-ar CRSD ./obj/local/armeabi/libandroid_native_app_glue.a ./obj/local/armeabi/objs/android_native_app_glue/android_native_app_glue.o
[armeabi] STATICLIBRARY:++的libstdc一
RM -f OBJ /本地/ armeabi /的libstdc ++。一
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/arm-linux-androideabi-ar CRSD ./obj/local/armeabi/libstdc++.a
[armeabi] SharedLibrary:libnative-activity.so
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/arm-linux-androideabi-g++轮候册,-soname,libnative-activity.so -shared --sysroot = /家庭/ schooten /箱/包/ Android的NDK-r9d /平台/ Android的9 /弓臂./obj/local/armeabi/objs /native-activity/main.o ./obj/local/armeabi/libandroid_native_app_glue.a JNI / lib中/ libv8_libbase.arm.a JNI / lib中/ libv8_nosnapshot.a JNI / lib中/ libv8_base.a JNI / lib中/ libstlport_static.a。 /obj/local/armeabi/libstdc++.a -lgcc -no-canonical- prefixes轮候册, - 没有不确定-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,现在-L /家庭/ schooten /箱/包/ Android的NDK-r9d /平台/ Android的9 /弓臂/ usr / lib目录-llog -landroid -lEGL -lGLESv1_CM -llog -lstdc ++ -lc -lm -o ./ OBJ /本地/ armeabi / libnative-activity.so
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上__clearColor(V8 :: FunctionCallbackInfo< V8 ::值>常量和放大器):JNI / main.cpp中:88:错误:未定义引用 V8 ::值:: Int32Value()const的
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上__clearColor(V8 :: FunctionCallbackInfo< V8 ::值>常量和放大器):JNI / main.cpp中:89:错误:未定义引用 V8 ::值:: Int32Value()const的
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上__clearColor(V8 :: FunctionCallbackInfo< V8 ::值>常量和放大器):JNI / main.cpp中:90:错误:未定义引用 V8 ::值:: Int32Value()const的
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上__clearColor(V8 :: FunctionCallbackInfo< V8 ::值>常量和放大器):JNI / main.cpp中:91:错误:未定义引用 V8 ::值:: Int32Value()const的
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上run_javascript(字符*):JNI / main.cpp中:101:错误:未定义引用'V8 ::隔离::新()
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上run_javascript(字符*):JNI /有/ v8.h:4045:错误:未定义引用'V8 :: ::隔离输入( )
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上run_javascript(字符*):JNI / main.cpp中:104:错误:未定义引用'V8 :: HandleScope :: HandleScope(V8: :隔离*)'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上run_javascript(字符*):JNI / main.cpp中:108:错误:未定义引用'V8 :: ObjectTemplate ::新(V8: :隔离*)'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上run_javascript(字符*):JNI / main.cpp中:110:错误:未定义引用'V8 :: ObjectTemplate ::新(V8: :隔离*)'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o:在功能上run_javascript(字符*):JNI / main.cpp中:112:错误:未定义引用'V8 ::字符串:: NewFromUtf8(V8: :隔离*,字符常量*,V8 ::字符串:: NewStringType,INT)
...等...

在特定的,这条线告诉我,* .a文件包括:

<$p$p><$c$c>/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/$p$pbuilt/linux-x86_64/bin/arm-linux-androideabi-g++轮候册,-soname,libnative-activity.so -shared --sysroot = /家庭/ schooten /箱/包/ Android的NDK-r9d /平台/ Android的9 /弓臂./obj/local/armeabi/objs /native-activity/main.o ./obj/local/armeabi/libandroid_native_app_glue.a JNI / lib中/ libv8_libbase.arm.a JNI / lib中/ libv8_nosnapshot.a JNI / lib中/ libv8_base.a JNI / lib中/ libstlport_static.a。 /obj/local/armeabi/libstdc++.a -lgcc -no-canonical- prefixes轮候册, - 没有不确定-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,现在-L /家庭/ schooten /箱/包/ Android的NDK-r9d /平台/ Android的9 /弓臂/ usr / lib目录-llog -landroid -lEGL -lGLESv1_CM -llog -lstdc ++ -lc -lm -o ./ OBJ /本地/ armeabi / libnative-activity.so

我的Andr​​oid.mk看起来是这样的:

  LOCAL_PATH:= $(叫我-DIR)包括$(CLEAR_VARS)
LOCAL_MODULE:=的STLport
LOCAL_MODULE_FILENAME:= stlport_static
LOCAL_SRC_FILES:= LIB / libstlport_static.a
包括$(preBUILT_STATIC_LIBRARY)包括$(CLEAR_VARS)
LOCAL_MODULE:= v8_base
LOCAL_MODULE_FILENAME:= v8_base_static
LOCAL_SRC_FILES:= LIB / libv8_base.a
包括$(preBUILT_STATIC_LIBRARY)包括$(CLEAR_VARS)
LOCAL_MODULE:= v8_nosnapshot
LOCAL_MODULE_FILENAME:= v8_nosnapshot_static
LOCAL_SRC_FILES:= LIB / libv8_nosnapshot.a
包括$(preBUILT_STATIC_LIBRARY)包括$(CLEAR_VARS)
LOCAL_MODULE:= v8_libbase
LOCAL_MODULE_FILENAME:= v8_libbase_static
LOCAL_SRC_FILES:= LIB / libv8_libbase.arm.a
包括$(preBUILT_STATIC_LIBRARY)包括$(CLEAR_VARS)
LOCAL_MODULE:=原生活动
LOCAL_SRC_FILES:= main.cpp中
LOCAL_LDLIBS:= -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES:= android_native_app_glue v8_libbase v8_nosnapshot v8_base的STLport
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/包括:
包括$(BUILD_SHARED_LIBRARY)$(呼叫进口模块,机器人/ native_app_glue)

凭经验确定LOCAL_STATIC_LIBRARIES秩序。我拨弄着它多一些,但无济于事。我甚至尝试LOCAL_WHOLE_STATIC_LIBRARIES。我检查符号的存在与纳米

  ARM-Linux的gnueabi纳米JNI / lib目录/ libv8_base.a | grep的Int32Value
         ü_ZNK2v85Value10Int32ValueEv
00000000ŧ_ZNK2v85Value10Int32ValueEv
         ü_ZNK2v85Value10Int32ValueEv臂Linux的gnueabi纳米JNI / lib目录/ libv8_base.a | grep的Utf8Value
00000000ŧ_ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
00000000ŧ_ZN2v86String9Utf8ValueC2ENS_6HandleINS_5ValueEEE
00000000ŧ_ZN2v86String9Utf8ValueD1Ev
00000000ŧ_ZN2v86String9Utf8ValueD2Ev
         ü_ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         ü_ZN2v86String9Utf8ValueD1Ev
         ü_ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         ü_ZN2v86String9Utf8ValueD1Ev
         ü_ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         ü_ZN2v86String9Utf8ValueD1Ev
         ü_ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         ü_ZN2v86String9Utf8ValueD1Ev
         ü_ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         ü_ZN2v86String9Utf8ValueD1Ev

我是名改写(munging)方面的专家,但看来他们的存在。值都为零,但我相信这是正常的。

所以我想,也许是连接不明白静态库,它就会失败。结果
但是我怎么检查,为什么连接失败拿起符号?


解决方案

我终于修好了,与一个朋友的帮助。首先我想一个解决办法,我想V8链接共享库,它并没有变成好,因为的 NDK本地活动界面我用的竟然是与装载其他共享对象不兼容。

有与我的静态库回事两个不同的问题。第一个也是最重要的一条是,通过内置V8静态库不适合用于连接。您可以通过使用检查:

  AR X [static_library.a]

它通常提取从库中*的.o对象。在这种情况下,报告的

 'X'不能薄档案馆

一个薄归档只是一组到* .o文件的绝对路径引用,并没有实际的内容。这就解释了为什么我的构建停在我移动或从V8构建树删除了原始* .o文件一个点的工作。奇怪的是,连接器保持沉默了。

创建静态库目前尚未V8构建选项。值得庆幸的是,这家伙创建正确的静态补丁图书馆V8。

该应用程序后仍我这样做,是因为我抄错文件第一次轮没有链接。事实证明,静态库还内置主机架构(不要问我为什么),我不小心复制的。我了解到,你可以使用:

 文件objectfile.o

要看到它是什么架构。因此,我发现我的静态库是i386和武装不了。因此,链接器被跳过这些文件,因为该架构不匹配(你可以在一个静态库中混合架构)。

下面是V8补丁,我为V8 28年3月27日提出基于Curu黄补丁。我将努力让这个补丁提交。补丁1:

 〜/工作/ JavaScript的/发动机/ V8干道/工具/石膏$差异-u v8.gyp.orig v8.gyp
--- v8.gyp.orig 2014年6月18日21:09:59.368336736 +0200
+++ v8.gyp 2014年6月18日21:12:20.264331660 +0200
@@ -108,6 +108,7 @@
     {
       TARGET_NAME':'v8_snapshot',
       '类型':'static_library',
+'standalone_static_library':1,
       '条件': [
         ['want_separate_host_toolset == 1',{
           '工具包':'主人','目标'],
@@ -180,6 +181,7 @@
     {
       TARGET_NAME':'v8_nosnapshot',
       '类型':'static_library',
+'standalone_static_library':1,
       依赖:
         v8_base',
       ]
@@ -237,6 +239,7 @@
     {
       TARGET_NAME':'v8_base',
       '类型':'static_library',
+'standalone_static_library':1,
       依赖:
         '。v8_libbase≤(v8_target_arch)',
       ]

2的修补程序:

 〜/工作/ JavaScript的/发动机/ V8干道/ THIRD_PARTY / ICU $差异-u icu.gyp.orig icu.gyp
--- icu.gyp.orig 2014年6月18日21:10:22.060335920 +0200
+++ icu.gyp 2014年6月18日21:15:06.468325674 +0200
@@ -56,6 +56,7 @@
         {
           TARGET_NAME':'icudata',
           '类型':'static_library',
+'standalone_static_library':1,
           定义:
             U_HIDE_DATA_SYMBOL',
           ]
@@ -141,6 +142,11 @@
         {
           TARGET_NAME':'icui18n',
           '类型':'≤(组分)',
+'条件':[
+'分量!=SHARED_LIBRARY',{
+'standalone_static_library':1,
+}],
+],
           '源':[
             '&LT; @(icui18n_sources),
           ]
@@ -241,6 +247,11 @@
         {
           TARGET_NAME':'icuuc',
           '类型':'≤(组分)',
+'条件':[
+'分量!=SHARED_LIBRARY',{
+'standalone_static_library':1,
+}],
+],
           '源':[
             '&LT; @(icuuc_sources),
           ]

I've been pulling my hair out over this one. I am developing on Ubuntu 12.04 64-bit. I created a native Android app with V8 embedded in it, but after rebooting my computer, it doesn't link with V8 anymore! I've tried reinstalling ndk and recompiling V8, but to no avail. It appears the linker does include the static libraries, but doesn't find the symbols in them. I checked with nm, and the symbols appear to be there.

When I run ndk_build, I get the following output:

$ ndk-build V=1
rm -f ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/armeabi-v7a-hard/lib*.so ./libs/mips/lib*.so ./libs/x86/lib*.so
rm -f ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/armeabi-v7a-hard/gdbserver ./libs/mips/gdbserver ./libs/x86/gdbserver
rm -f ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/armeabi-v7a-hard/gdb.setup ./libs/mips/gdb.setup ./libs/x86/gdb.setup
[armeabi] Compile++ thumb: native-activity <= main.cpp
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/native-activity/main.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Ijni/include -I/home/schooten/bin/packages/android-ndk-r9d/sources/android/native_app_glue -I/home/schooten/bin/packages/android-ndk-r9d/sources/cxx-stl/system/include -Ijni -DANDROID  -Wa,--noexecstack -Wformat -Werror=format-security      -I/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm/usr/include -c  jni/main.cpp -o ./obj/local/armeabi/objs/native-activity/main.o 
[armeabi] Compile thumb  : android_native_app_glue <= android_native_app_glue.c
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -MMD -MP -MF ./obj/local/armeabi/objs/android_native_app_glue/android_native_app_glue.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -I/home/schooten/bin/packages/android-ndk-r9d/sources/android/native_app_glue -DANDROID  -Wa,--noexecstack -Wformat -Werror=format-security    -I/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm/usr/include -c  /home/schooten/bin/packages/android-ndk-r9d/sources/android/native_app_glue/android_native_app_glue.c -o ./obj/local/armeabi/objs/android_native_app_glue/android_native_app_glue.o 
[armeabi] StaticLibrary  : libandroid_native_app_glue.a
rm -f obj/local/armeabi/libandroid_native_app_glue.a
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar crsD ./obj/local/armeabi/libandroid_native_app_glue.a ./obj/local/armeabi/objs/android_native_app_glue/android_native_app_glue.o
[armeabi] StaticLibrary  : libstdc++.a
rm -f obj/local/armeabi/libstdc++.a
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar crsD ./obj/local/armeabi/libstdc++.a 
[armeabi] SharedLibrary  : libnative-activity.so
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libnative-activity.so -shared --sysroot=/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm ./obj/local/armeabi/objs/native-activity/main.o ./obj/local/armeabi/libandroid_native_app_glue.a jni/lib/libv8_libbase.arm.a jni/lib/libv8_nosnapshot.a jni/lib/libv8_base.a jni/lib/libstlport_static.a ./obj/local/armeabi/libstdc++.a -lgcc -no-canonical-prefixes  -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now  -L/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm/usr/lib -llog -landroid -lEGL -lGLESv1_CM -llog -lstdc++ -lc -lm -o ./obj/local/armeabi/libnative-activity.so
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function __clearColor(v8::FunctionCallbackInfo<v8::Value> const&):jni/main.cpp:88: error: undefined reference to 'v8::Value::Int32Value() const'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function __clearColor(v8::FunctionCallbackInfo<v8::Value> const&):jni/main.cpp:89: error: undefined reference to 'v8::Value::Int32Value() const'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function __clearColor(v8::FunctionCallbackInfo<v8::Value> const&):jni/main.cpp:90: error: undefined reference to 'v8::Value::Int32Value() const'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function __clearColor(v8::FunctionCallbackInfo<v8::Value> const&):jni/main.cpp:91: error: undefined reference to 'v8::Value::Int32Value() const'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:101: error: undefined reference to 'v8::Isolate::New()'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/include/v8.h:4045: error: undefined reference to 'v8::Isolate::Enter()'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:104: error: undefined reference to 'v8::HandleScope::HandleScope(v8::Isolate*)'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:108: error: undefined reference to 'v8::ObjectTemplate::New(v8::Isolate*)'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:110: error: undefined reference to 'v8::ObjectTemplate::New(v8::Isolate*)'
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:112: error: undefined reference to 'v8::String::NewFromUtf8(v8::Isolate*, char const*, v8::String::NewStringType, int)'
... etc ...

In particular, this line tells me that the *.a files are included:

/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libnative-activity.so -shared --sysroot=/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm ./obj/local/armeabi/objs/native-activity/main.o ./obj/local/armeabi/libandroid_native_app_glue.a jni/lib/libv8_libbase.arm.a jni/lib/libv8_nosnapshot.a jni/lib/libv8_base.a jni/lib/libstlport_static.a ./obj/local/armeabi/libstdc++.a -lgcc -no-canonical-prefixes  -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now  -L/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm/usr/lib -llog -landroid -lEGL -lGLESv1_CM -llog -lstdc++ -lc -lm -o ./obj/local/armeabi/libnative-activity.so

My Android.mk looks like this:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE          := stlport
LOCAL_MODULE_FILENAME := stlport_static
LOCAL_SRC_FILES := lib/libstlport_static.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE          := v8_base
LOCAL_MODULE_FILENAME := v8_base_static
LOCAL_SRC_FILES := lib/libv8_base.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE          := v8_nosnapshot
LOCAL_MODULE_FILENAME := v8_nosnapshot_static
LOCAL_SRC_FILES := lib/libv8_nosnapshot.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE          := v8_libbase
LOCAL_MODULE_FILENAME := v8_libbase_static
LOCAL_SRC_FILES := lib/libv8_libbase.arm.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := native-activity
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue v8_libbase v8_nosnapshot v8_base stlport
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

The LOCAL_STATIC_LIBRARIES order was determined empirically. I fiddled with it some more, but to no avail. I even tried LOCAL_WHOLE_STATIC_LIBRARIES. I checked the existence of symbols with nm:

arm-linux-gnueabi-nm jni/lib/libv8_base.a | grep Int32Value
         U _ZNK2v85Value10Int32ValueEv
00000000 T _ZNK2v85Value10Int32ValueEv
         U _ZNK2v85Value10Int32ValueEv

arm-linux-gnueabi-nm jni/lib/libv8_base.a | grep Utf8Value
00000000 T _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
00000000 T _ZN2v86String9Utf8ValueC2ENS_6HandleINS_5ValueEEE
00000000 T _ZN2v86String9Utf8ValueD1Ev
00000000 T _ZN2v86String9Utf8ValueD2Ev
         U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         U _ZN2v86String9Utf8ValueD1Ev
         U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         U _ZN2v86String9Utf8ValueD1Ev
         U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         U _ZN2v86String9Utf8ValueD1Ev
         U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         U _ZN2v86String9Utf8ValueD1Ev
         U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE
         U _ZN2v86String9Utf8ValueD1Ev

I am no expert at name munging, but it appears they are there. The values are all zeroes, but I believe this is normal.

So I figured, maybe the linker doesn't understand the static library, and it fails silently.
But how do I check why the linker is failing to pick up the symbols?

解决方案

I finally fixed it, with help of a friend. First I tried a workaround where I tried to link V8 as a shared library, which didn't turn out well because the NDK native activity interface I'm using turned out to be incompatible with loading additional shared objects.

There were two different issues going on with my static libraries. The first and most important one is that the static libraries built by V8 are not suitable for linking. You can check this by using:

ar x [static_library.a]

which will normally extract the *.o objects from the library. In this case, it reported:

`x' cannot be used on thin archives

A thin archive is just a set of references to the absolute paths of the *.o files, and no actual content. That explains why my build stopped working at one point where I moved or deleted the original *.o files from the V8 build tree. Strangely, the linker kept silent about that.

Creating static libraries is not currently a build option in V8. Thankfully, this guy has a patch for creating proper static libraries in V8.

The app still didn't link after I did that, because I copied the wrong files the first time round. As it turned out, the static libraries are also built for the host architecture (don't ask me why), and I accidentally copied those. I learned that you can use:

file objectfile.o

to see what architecture it is. Hence I found my static libraries were i386 and not arm. So, the linker was skipping these files, because the architecture didn't match (you can mix architectures in a static library).

Here is the V8 patch that I made to V8 3.27.28 based on the patch by Curu Wong. I will try to get this patch committed. Patch 1:

~/Work/javascript/Engines/v8-trunk/tools/gyp$ diff -u v8.gyp.orig  v8.gyp
--- v8.gyp.orig 2014-06-18 21:09:59.368336736 +0200
+++ v8.gyp  2014-06-18 21:12:20.264331660 +0200
@@ -108,6 +108,7 @@
     {
       'target_name': 'v8_snapshot',
       'type': 'static_library',
+      'standalone_static_library': 1,
       'conditions': [
         ['want_separate_host_toolset==1', {
           'toolsets': ['host', 'target'],
@@ -180,6 +181,7 @@
     {
       'target_name': 'v8_nosnapshot',
       'type': 'static_library',
+      'standalone_static_library': 1,
       'dependencies': [
         'v8_base',
       ],
@@ -237,6 +239,7 @@
     {
       'target_name': 'v8_base',
       'type': 'static_library',
+      'standalone_static_library': 1,
       'dependencies': [
         'v8_libbase.<(v8_target_arch)',
       ],

Patch 2:

~/Work/javascript/Engines/v8-trunk/third_party/icu$ diff -u icu.gyp.orig icu.gyp
--- icu.gyp.orig    2014-06-18 21:10:22.060335920 +0200
+++ icu.gyp 2014-06-18 21:15:06.468325674 +0200
@@ -56,6 +56,7 @@
         {
           'target_name': 'icudata',
           'type': 'static_library',
+          'standalone_static_library': 1,
           'defines': [
             'U_HIDE_DATA_SYMBOL',
           ],
@@ -141,6 +142,11 @@
         {
           'target_name': 'icui18n',
           'type': '<(component)',
+          'conditions': [
+            [ 'component!="shared_library"', {
+                'standalone_static_library': 1,
+            }],
+          ],
           'sources': [
             '<@(icui18n_sources)',
           ],
@@ -241,6 +247,11 @@
         {
           'target_name': 'icuuc',
           'type': '<(component)',
+          'conditions': [
+            [ 'component!="shared_library"', {
+                'standalone_static_library': 1,
+            }],
+          ],
           'sources': [
             '<@(icuuc_sources)',
           ],

这篇关于Android的NDK连接V8静态库:无法找到符号,但它们的存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆