是否可以在 Jetpack Compose @preview 函数中加载本机库?

Jak*_* M. 5 java-native-interface android swig android-ndk android-jetpack-compose

我已经开始使用 Jetpack Compose 在我的应用程序上实现一项功能。该应用程序使用Swig生成代码,使我能够与 Kotlin/Java 的 C++ 层进行交互。为了使用 C++ 层,我在应用程序的主要活动中加载如下库:

static {
    System.loadLibrary("{swig library name}");
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 Jetpack Compose 预览时,出现以下渲染问题:

java.lang.UnsatisfiedLinkError: 'void {package containing swig's generated code}.swigWrappersJNI.swig_module_init()'
Run Code Online (Sandbox Code Playgroud)

该函数确实使用了 Swig 生成的类,所以我假设这就是发生这种情况的原因。

我尝试通过将以下内容添加到预览功能来解决此问题:

System.loadLibrary("{swig library name}")
Run Code Online (Sandbox Code Playgroud)

但这只会导致以下渲染问题:

java.lang.UnsatisfiedLinkError: no {swig library name} in java.library.path:
Run Code Online (Sandbox Code Playgroud)

有谁知道我如何/是否可以正确链接该库,以便我可以在使用此应用程序时使用 Compose 的预览功能?

编辑:

有关更多信息,我尝试了以下方法来加载我的库:

@Composable
@Preview
fun ___Preview() {
    System.loadLibrary("{swig library name}");

    // Actual preview code here
}
Run Code Online (Sandbox Code Playgroud)
object LibraryLoader {
    fun load() {
        System.loadLibrary("{swig library name}")
    }
}

@Composable
@Preview
fun ___Preview() {
    LibraryLoader.load()

    // Actual preview code here
}
Run Code Online (Sandbox Code Playgroud)

(这有点盲目。我认为关键的区别可能是在一个static块内加载它,但这没有效果。)

预览可以成功部署到设备/模拟器。

我认为这里的问题是该库位于 中lib/{abi}/{swig library name}.so,因此它在设备/模拟器(具有受支持的 ABI)上运行时存在,但在 Compose 预览中不存在。

我为解决这个问题所做的工作是创建模型类的副本,该副本不使用任何 Swig 生成的代码,这样我就可以在创建布局时利用预览,然后将它们替换为实际的模型类以测试功能。这绝对不是我特别满意的解决方案,但它可能是在这种情况下使用 Compose 预览的唯一方法。