我很新的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生成的。我真的没有线索.. –