我有一个Rust库,它是我为Android编译的静态库(Eng.a),这个库包含一些C兼容(FFI)函数.I've already figured out how to bind and call this library from Java.现在我想从C++调用这些函数(直接调用,不使用JNI).
编译完这个库后,我将生成的文件放在PROJECT_ROOT/android/jniLibs
以下,这是Android自动将它们打包到应用程序中的默认位置:
android
- jniLibs
- arm64-v8a
- engine.a
- armeabi-v7a
- engine.a
... // so on for the rest of supported archs
我已经生成了一个包含与C兼容的函数的头文件(Engineering.h使用cbindgen
,所有函数都用no_mangle
和extern "C"
正确地进行了注释),并将其与我的源代码C++放在一起.这在iOS上已经起作用了,但在Android上,我遇到了一个未定义的符号错误.
Android Studio对导入的标题很满意,并且没有在编辑器中显示任何错误:
#include "engine.h"
...
int res = my_rust_fn();
我的CMakeLists.txt
:
${PACKAGE_NAME}
SHARED
../cpp/bindings.cpp # contains my C++ that should call the functions in engine.h
../cpp/engine.h
cpp-adapter.cpp
)
include_directories(
../cpp
)
set_target_properties(
${PACKAGE_NAME} PROPERTIES
CXX_STANDARD 17
CXX_EXTENSIONS OFF
POSITION_INDEPENDENT_CODE ON
)
find_package(ReactAndroid REQUIRED CONFIG)
find_package(fbjni REQUIRED CONFIG)
target_link_libraries(
${PACKAGE_NAME}
fbjni::fbjni
ReactAndroid::jsi
ReactAndroid::turbomodulejsijni
ReactAndroid::react_nativemodule_core
android
)
但是,当编译代码时,我在my_rust_fn
调用时得到一个未定义的符号:
ld: error: undefined symbol: my_rust_fn
>>> referenced by bindings.cpp:91
我还try 使用静态库的名称向cmake列表中添加find_package,但没有成功,它只是抛出一个错误:
find_package(engine REQUIRED CONFIG)
target_link_libraries(
$(PACKAGE_NAME)
engine
...
)
有什么建议我可能做错了什么吗?