我很新的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文件似乎是正確的)
你試圖添加'設置(CMAKE_VERBOSE_MAKEFILE上)'?從你的解釋中很難判斷出了什麼問題 - 或者從libnative.so中刪除了符號,或者鏈接libfoo.a被完全忽略。 –
@LlexCohn鏈接的libfoo.a不會被跳過,因爲我可以從libnative調用libfoo的方法,並且它正確地鏈接和工作。它看起來像符號被剝離或不從外部顯着導出,但我試圖強制-fvisibility =默認沒有任何成功。不幸的是,所使用的生成器不是make的,所以沒有makefile。我可以看到調用命令,它看起來是正確的。這是由喜歡native.o和libfoo.a生成的。我真的沒有線索.. – Jack