Flutter集成Evolis打印机.so库遇UnsatisfiedLinkError问题求助
问题:Flutter集成Evolis打印机JNI调用报错
UnsatisfiedLinkError 我开发了一款Flutter应用,需集成Evolis品牌打印机,对方提供了Android适用的.so库及头文件。Android端采用Kotlin开发,已在MainActivity中添加Flutter通道,调用Activity内普通函数正常,但调用evolis_version()时出现以下错误:
java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String de.example.print_app.MainActivity.evolis_version() (tried Java_de_example_print_1app_MainActivity_evolis_1version and Java_de_example_print_1app_MainActivity_evolis_1version__)
已完成的配置操作
- 在SDK Manager中安装NDK和CMake
- MainActivity代码:
class MainActivity : FlutterActivity() { init { System.loadLibrary("evolis") } external fun evolis_version(): String }
- 将.so文件放入
app/src/main/jniLibs/目录,包含:arm64-v8a/libevolis.soarmeabi-v7a/libevolis.sox86/libevolis.sox86_64/libevolis.so
- app/build.gradle配置:
android{ package "de.example.print_app" [...] externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" version "3.22.1" } } sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } }
- 添加头文件
app/src/main/cpp/evolis.h,关键内容:
[...] EVOLIS_WRA const char* evolis_version(void); [...]
- CMake配置文件
app/src/main/cpp/CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1) # Ensure the shared library is correctly imported add_library(evolis SHARED IMPORTED) set_target_properties(evolis PROPERTIES IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libevolis.so") add_library(native-lib SHARED evolis_jni.cpp) include_directories(src/main/cpp) # Ensure the header file is included find_library(log-lib log) target_link_libraries(native-lib ${log-lib} evolis)
- JNI封装文件(原路径笔误,应为
app/src/main/cpp/evolis_jni.cpp):
#include <jni.h> #include <string> #include "evolis.h" // Include your library's header file #ifdef __cplusplus extern "C" { #endif // JNI wrapper for evolis_version() JNIEXPORT jstring JNICALL Java_de_example_print_1app_MainActivity_evolis_1version(JNIEnv *env, jobject thiz) { const char *version = evolis_version(); // Call function from .so return env->NewStringUTF(version); } #ifdef __cplusplus } #endif
问题排查与解决步骤
1. 修正库加载顺序
当前仅加载了evolis库,但JNI封装代码编译为native-lib库,需先加载依赖库再加载封装库。修改MainActivity的init块:
init { System.loadLibrary("evolis") System.loadLibrary("native-lib") // 新增加载封装库 }
2. 修复JNI文件路径
原描述中JNI文件路径为add/main/cpp/evolis_jni.cpp,属于笔误,需将文件移至app/src/main/cpp/目录,确保CMake能找到文件并编译。
3. 验证JNI函数签名(可选)
确认包名、类名、函数名的JNI转换规则是否匹配:
- 包名
de.example.print_app转换后为de_example_print_1app(下划线替换点,_1替换原包名中的下划线) - 类名
MainActivity直接保留 - 函数名
evolis_version转换后为evolis_1version
你的JNI函数签名是正确的,若仍存疑,可使用nm工具检查编译后的库是否包含目标函数:
nm -D app/build/intermediates/cmake/debug/obj/[你的ABI]/libnative-lib.so | grep evolis_version
4. 优化CMake路径配置
尝试用${CMAKE_CURRENT_SOURCE_DIR}替代${CMAKE_SOURCE_DIR},确保路径解析更准确:
set_target_properties(evolis PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libevolis.so")
5. 清理重建项目
执行以下操作消除缓存问题:
- 运行
./gradlew clean - 删除项目根目录及模块下的
build目录 - 重新同步Gradle并编译项目
内容的提问来源于stack exchange,提问作者Haissem55
相关产品推荐
相关产品推荐

