You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.so
    • armeabi-v7a/libevolis.so
    • x86/libevolis.so
    • x86_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:46:22