我认为问题是我没有立即包括共享库,但是我不确定。
我得到的错误是
error: undefined reference to 'tflite::InterpreterBuilder::operator()(std::__ndk1::unique_ptr<tflite::Interpreter, std::__ndk1::default_delete<tflite::Interpreter> >*)
指向以下内容的最后一行:
std::unique_ptr<tflite::FlatBufferModel> model = tflite::FlatBufferModel::BuildFromFile(casemodel_path.c_str());
tflite::ops::builtin::BuiltinOpResolver resolver;
tflite::InterpreterBuilder builder(*model.get(), resolver);
std::unique_ptr<tflite::Interpreter> interpreter;
builder(&interpreter);
我从here那里拿走了,因为documentation似乎已经过时了。
我使用NDK16b从源代码编译了tensorflow。我遵循this进行编译。
我的cmake文件的相关部分如下所示:
[...]
# Flatbuffer
set(FLATB_DIR <path-to>/git/flatbuffers)
include_directories(${FLATB_DIR}/include)
include_directories(${FLATB_DIR}/grpc)
file(GLOB flatb_src "${FLATB_DIR}/src/*.cpp")
add_library(flatbuffer ${flatb_src})
add_library(libtensorflowlite SHARED IMPORTED)
set_target_properties(libtensorflowlite PROPERTIES IMPORTED_LOCATION
<path-to>/app/src/main/jniLibs/armeabi-v7a/libtensorflowlite.so)
include_directories(<path-to>/git/tensorflow-android)
[...]
target_link_libraries(flatbuffer libtensorflowlite <tons-of-other-libraries>)
正如我已经提到的,我认为问题在于我没有以正确的方式包括共享库。我所做的只是在jniLibs/armeabi-v7a/
下创建了文件夹src/main
,在其中放置了libtensorflowlite.so
。谷歌搜索似乎是做到这一点的一种方法?我尝试了其他方法(使用sourceSets
和implementation fileTree
,但没有任何效果)。
我还使用了其他一些预编译的库,但是它们是静态的(在target_link_libraries
中,我直接指向它们的路径)。这样混合静态/共享库是否有问题?
编辑:在this之后,我还尝试使用ndk15c并编辑ANDROID_NDK_API_LEVEL
,但这无济于事。