我如何从我的 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()。然后使用 dlopendlsym.

动态调用 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 更改为其他名称意味着它将可用。