在使用 C++ 和 Java 的 Android 应用程序中包含 TFLite C API 时出现构建问题
Build issue when including TFLite C API in Android app that uses C++ and Java
我正在通过 C++ 使用 TFLite 使用 NDK 构建我的应用程序,希望能帮助解决链接错误。我关注的指南是 https://www.tensorflow.org/lite/guide/android#use_tflite_c_api
我在使用 CMake 构建的程序中包含了 TFLite C API header 文件和动态共享库。
我收到以下错误:
../../../../src/main/cpp/TFLiteExample.cpp:17: error: undefined reference to 'TfLiteModelCreateFromFile'
一些附加信息:我在 app/src/main/includes
中包含 header 文件,在 app/src/main/jni
中包含 .so
动态库。 CMakeLists.txt
文件在 app/src/main
中。下面是CMakeLists.txt
的相关组件:
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_VERBOSE_MAKEFILE ON)
###Internal Linking
#Add internal C++ libraries
add_library( native-lib SHARED src/main/cpp/native-lib.cpp )
add_library( TFLiteExample SHARED src/main/cpp/TFLiteExample.cpp)
add_library( tensorflowlite_jni SHARED IMPORTED )
set_property(TARGET tensorflowlite_jni
PROPERTY IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jni/libtensorflowlite_jni.so)
#Make directories visible to all C++ files
include_directories(src/main/includes)
include_directories(src/main/cpp)
include_directories(src/main/jni)
# Specify the libraries which our native library is dependent on, including Oboe
target_link_libraries (native-lib tensorflowlite_jni TFLiteExample)
target_link_libraries(TFLiteExample tensorflowlite_jni)
这里是TFLiteExample.h
:
#ifndef TEST2_TFLITEEXAMPLE_H
#define TEST2_TFLITEEXAMPLE_H
// TFLite include files
#include <builtin_ops.h>
#include <c_api.h>
#include <c_api_experimental.h>
#include <common.h>
class TFLiteExample {
public:
TFLiteExample();
static void TFLitePredict();
};
#endif //TEST2_TFLITEEXAMPLE_H
这里是TFLiteExample.cpp
:
#include "TFLiteExample.h"
TFLiteExample::TFLiteExample(){
}
void TFLiteExample::TFLitePredict() {
TfLiteModel* model = TfLiteModelCreateFromFile("/src/main/assets/_quant.tflite");
}
Headers common.h
和 c_api.h
都是来自 Tensorflow 的代码。除了用 #include <cstdbool>
.
替换 #include "../../../../../../../../../../../Library/Android/sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1/stdbool.h"
等相对包含路径外,我没有修改代码
common
以下列内容开头:
#ifndef TENSORFLOW_LITE_C_COMMON_H_
#define TENSORFLOW_LITE_C_COMMON_H_
#include <cstdbool>
#include <stddef>
#include <stdint>
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
...
和c_api
与:
#ifndef TENSORFLOW_LITE_C_C_API_H_
#define TENSORFLOW_LITE_C_C_API_H_
#include <stdarg>
#include <stdint>
#include "common.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
...
更新:程序已按照以下说明成功构建:
https://whosebug.com/a/63372486/4008884.
我做了以下修改:
首先,我替换了文件结构
app/src/main/jni/libtensorflowlite_jni.so
和
app/src/main/jni/arm64-v8a/libtensorflowlite_jni.so
app/src/main/jni/armeabi-v7a/libtensorflowlite_jni.so
app/src/main/jni/x86_64/libtensorflowlite_jni.so
app/src/main/jni/x86/libtensorflowlite_jni.so
其次,我将 TFLite C API headers 移动到同一目录,app/src/main/jni/
。
第三,我在 android {
部分的 build.gradle
中加入了以下内容:
ndk {
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
}
最后,我将 ${ANDROID_ABI}
添加到 CMakeLists.txt 中的链接:
set(JNI_DIR ${PROJECT_SOURCE_DIR}/src/main/jni)
add_library( tensorflowlite_jni SHARED IMPORTED)
set_target_properties(tensorflowlite_jni
PROPERTIES IMPORTED_LOCATION
${JNI_DIR}/${ANDROID_ABI}/libtensorflowlite_jni.so)
include_directories( ${JNI_DIR} )
target_link_libraries(native-lib tensorflowlite_jni)
我的功能有问题
显示的错误是undefined reference to TfLiteModelCreateFromFile
;我想在 C 语言的程序中使用 API C 作为 TensorFlow。这是我的程序
int32_t main(int32_t argc, char *argv[])
{
TfLiteModel* model = TfLiteModelCreateFromFile("iris.tflite");
TfLiteInterpreterOptions*options =TfLiteInterpreterOptionsCreate();
}
我正在通过 C++ 使用 TFLite 使用 NDK 构建我的应用程序,希望能帮助解决链接错误。我关注的指南是 https://www.tensorflow.org/lite/guide/android#use_tflite_c_api
我在使用 CMake 构建的程序中包含了 TFLite C API header 文件和动态共享库。
我收到以下错误:
../../../../src/main/cpp/TFLiteExample.cpp:17: error: undefined reference to 'TfLiteModelCreateFromFile'
一些附加信息:我在 app/src/main/includes
中包含 header 文件,在 app/src/main/jni
中包含 .so
动态库。 CMakeLists.txt
文件在 app/src/main
中。下面是CMakeLists.txt
的相关组件:
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_VERBOSE_MAKEFILE ON)
###Internal Linking
#Add internal C++ libraries
add_library( native-lib SHARED src/main/cpp/native-lib.cpp )
add_library( TFLiteExample SHARED src/main/cpp/TFLiteExample.cpp)
add_library( tensorflowlite_jni SHARED IMPORTED )
set_property(TARGET tensorflowlite_jni
PROPERTY IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jni/libtensorflowlite_jni.so)
#Make directories visible to all C++ files
include_directories(src/main/includes)
include_directories(src/main/cpp)
include_directories(src/main/jni)
# Specify the libraries which our native library is dependent on, including Oboe
target_link_libraries (native-lib tensorflowlite_jni TFLiteExample)
target_link_libraries(TFLiteExample tensorflowlite_jni)
这里是TFLiteExample.h
:
#ifndef TEST2_TFLITEEXAMPLE_H
#define TEST2_TFLITEEXAMPLE_H
// TFLite include files
#include <builtin_ops.h>
#include <c_api.h>
#include <c_api_experimental.h>
#include <common.h>
class TFLiteExample {
public:
TFLiteExample();
static void TFLitePredict();
};
#endif //TEST2_TFLITEEXAMPLE_H
这里是TFLiteExample.cpp
:
#include "TFLiteExample.h"
TFLiteExample::TFLiteExample(){
}
void TFLiteExample::TFLitePredict() {
TfLiteModel* model = TfLiteModelCreateFromFile("/src/main/assets/_quant.tflite");
}
Headers common.h
和 c_api.h
都是来自 Tensorflow 的代码。除了用 #include <cstdbool>
.
#include "../../../../../../../../../../../Library/Android/sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1/stdbool.h"
等相对包含路径外,我没有修改代码
common
以下列内容开头:
#ifndef TENSORFLOW_LITE_C_COMMON_H_
#define TENSORFLOW_LITE_C_COMMON_H_
#include <cstdbool>
#include <stddef>
#include <stdint>
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
...
和c_api
与:
#ifndef TENSORFLOW_LITE_C_C_API_H_
#define TENSORFLOW_LITE_C_C_API_H_
#include <stdarg>
#include <stdint>
#include "common.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
...
更新:程序已按照以下说明成功构建: https://whosebug.com/a/63372486/4008884.
我做了以下修改:
首先,我替换了文件结构
app/src/main/jni/libtensorflowlite_jni.so
和
app/src/main/jni/arm64-v8a/libtensorflowlite_jni.so
app/src/main/jni/armeabi-v7a/libtensorflowlite_jni.so
app/src/main/jni/x86_64/libtensorflowlite_jni.so
app/src/main/jni/x86/libtensorflowlite_jni.so
其次,我将 TFLite C API headers 移动到同一目录,app/src/main/jni/
。
第三,我在 android {
部分的 build.gradle
中加入了以下内容:
ndk {
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
}
最后,我将 ${ANDROID_ABI}
添加到 CMakeLists.txt 中的链接:
set(JNI_DIR ${PROJECT_SOURCE_DIR}/src/main/jni)
add_library( tensorflowlite_jni SHARED IMPORTED)
set_target_properties(tensorflowlite_jni
PROPERTIES IMPORTED_LOCATION
${JNI_DIR}/${ANDROID_ABI}/libtensorflowlite_jni.so)
include_directories( ${JNI_DIR} )
target_link_libraries(native-lib tensorflowlite_jni)
我的功能有问题
显示的错误是undefined reference to TfLiteModelCreateFromFile
;我想在 C 语言的程序中使用 API C 作为 TensorFlow。这是我的程序
int32_t main(int32_t argc, char *argv[])
{
TfLiteModel* model = TfLiteModelCreateFromFile("iris.tflite");
TfLiteInterpreterOptions*options =TfLiteInterpreterOptionsCreate();
}