我如何从我的 Bazel cc_library 中公开一个回调,以便它可以从我的 Android 项目中的 libSDL2 中调用?
How can I expose a callback from my Bazel cc_library so it can be called from libSDL2 in my Android project?
SDL2 Android 项目包含一个 Android Activity class (SDLActivity),它在其中传递 C 库的名称和回调SDL_android.c 使用 JNI 调用 nativeRunMain()
。然后使用 dlopen
和 dlsym
.
动态调用 C 回调
但是,当 运行 adb logcat
时,nativeRunMain() 表示它 Couldn't find function main in library lib<android-binary>.so
。
我的 cc_library 定义如下所示:
cc_library(
name = "main",
srcs = ["jni/main.c"],
deps = [
"@libSDL2//:lib"
]
)
main.c
#include <stdio.h>
#include "SDL.h"
int main(int argc, char* argv[]) {
...
}
此处可重现示例代码:
https://files.fm/u/hr62nbr3
main
未作为符号导出,因为它是保留的函数名称,将名称更改为其他名称可以解决此问题。
使用 nm -D
检查 .so 文件的动态符号 table,我可以看到 main
没有作为符号导出。将函数的名称 main
更改为其他名称意味着它将可用。
SDL2 Android 项目包含一个 Android Activity class (SDLActivity),它在其中传递 C 库的名称和回调SDL_android.c 使用 JNI 调用 nativeRunMain()
。然后使用 dlopen
和 dlsym
.
但是,当 运行 adb logcat
时,nativeRunMain() 表示它 Couldn't find function main in library lib<android-binary>.so
。
我的 cc_library 定义如下所示:
cc_library(
name = "main",
srcs = ["jni/main.c"],
deps = [
"@libSDL2//:lib"
]
)
main.c
#include <stdio.h>
#include "SDL.h"
int main(int argc, char* argv[]) {
...
}
此处可重现示例代码: https://files.fm/u/hr62nbr3
main
未作为符号导出,因为它是保留的函数名称,将名称更改为其他名称可以解决此问题。
使用 nm -D
检查 .so 文件的动态符号 table,我可以看到 main
没有作为符号导出。将函数的名称 main
更改为其他名称意味着它将可用。