android静态链接冲突cmake,Android NDK CMake链接问题

我很新的NDK + Gradle + CMake集成,我试图理解为什么链接不会按预期导出符号。Android NDK CMake链接问题

我有一个由CMakeLists.txt构建的静态库,它不是主要的CMakeLists.txt。

脚本确实是这样的:

# main CMakeLists.txt

add_subdirectory(${LIBS}/foo libs}

add_library(native SHARED native.cpp)

# omitting standard android libraries

target_link_libraries(native foo ${android-lib} ${log-lib})

而CMakeLists.txt内${libs}/foo如下:

# misc configuration of ${SRC}

add_library(foo STATIC ${SRC})

该脚本能正常工作,它能够链接libnative.so,我能够找到生成libfoo.a。一切似乎都很好。

我再尝试中所含的富库foo.cpp定义一个本地方法:

extern "C" JNIEXPORT void JNICALL Java_com_mypackage_Controls_onTap(JNIEnv*, jobject, int x, int y) {

// log something

}

但我无法调用FOO库中定义的本地方法。我在运行时得到一个UnsatisfiedLinkError。相反,如果我将(直接通过复制和粘贴)方法移动到native.cpp,那么一切都很顺利。

所以基本上:

爪哇 - >在native.cpp方法工作

爪哇 - 在native.cpp>方法 - >在富库中定义的方法工作

的Java - >在foo库中的方法不起作用(UnsatisfiedLinkError)

我试着用nm检查导出的函数,它看起来像foo.a正确导出本机的功能,我可以看到

00011060 T Java_com_mypackage_Controls_onTap

但该条目从libnative.so消失。相反,如果我直接在native.cpp中定义方法,那么我也可以在libnative.so上使用nm正确地看到它。

另外调用foo库中的任何方法从native.cpp起按预期工作,以便库有效地静态链接。

我无法理解背后的原因,该方法应该没问题,应该是正确的,因为它的宏应该是JNIEXPORT,所以我真的在黑暗中摸索(而且Gradle没有提供任何汇编输出阶段,所以我不明白发生了什么,但build.ninja文件似乎是正确的)

2016-10-15

Jack

+0

你试图添加'设置(CMAKE_VERBOSE_MAKEFILE上)'?从你的解释中很难判断出了什么问题 - 或者从libnative.so中删除了符号,或者链接libfoo.a被完全忽略。 –

+0

@LlexCohn链接的libfoo.a不会被跳过,因为我可以从libnative调用libfoo的方法,并且它正确地链接和工作。它看起来像符号被剥离或不从外部显着导出,但我试图强制-fvisibility =默认没有任何成功。不幸的是,所使用的生成器不是make的,所以没有makefile。我可以看到调用命令,它看起来是正确的。这是由喜欢native.o和libfoo.a生成的。我真的没有线索.. –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值