繁体   English   中英

Flutter - Java 通过 MethodChannel 调用 C++

[英]Flutter - Java calling C++ via MethodChannel

I am trying to create a Flutter application that will be utilizing MethodChannel to call some Java code using dart that will be calling a shared library written in C++.

我能够编译一个 Java 程序,该程序链接到使用 JNI 的 C++ 库并运行它,但是一旦我尝试将文件导入 Flutter 文件的路径。 .

我正在寻求有关如何配置 Flutter 及其 Android 文件的帮助,以便能够实现此行为。

我将添加我使用的 CMakeLists.txt,以便编译和链接.jar 和.so。

CMakeLists.txt

cmake_minimum_required(VERSION 3.7 FATAL_ERROR)

project(shared_library_java_cpp VERSION 1.0.0 LANGUAGES CXX)
set(JAVA_AWT_LIBRARY NotNeeded)
set(JAVA_JVM_LIBRARY NotNeeded)
set(JAVA_INCLUDE_PATH2 NotNeeded)
set(JAVA_AWT_INCLUDE_PATH NotNeeded)

find_package(JNI REQUIRED)
find_package(Java REQUIRED)
include_directories(${JNI_INCLUDE_DIRS})
include(UseJava)

set(CMAKE_CXX_STANDARD 11)
set(CMALE_CXX_STANDARD_REQUIRED ON)
set(JAR_NAME JavaCPP)
set(JAVA_SOURCE_DIRECTORY "/Users/user/Desktop/Temp/com/example/javacpplib")
set(JAVA_SOURCE_FILES ${JAVA_SOURCE_DIRECTORY}/JavaCPP.java)
add_jar(${JAR_NAME} ${JAVA_SOURCE_FILES})

add_library(shared_library_java_cpp SHARED java_cpp.cpp java_cpp.def)
add_executable(java_cpp_exec java_cpp.cpp)

set_target_properties(shared_library_java_cpp PROPERTIES
    PUBLIC_HEADER lib_java_cpp.h
    VERSION ${PROJECT_VERSION}
    SOVERSION 1
    OUTPUT_NAME "java_cpp"
    XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "MacOS_ID"
)

除了在 intelliJ 中运行代码之外,我还使用此方法加载共享库:

static {
        System.load("/Users/user/IdeaProjects/JavaCPP/src/lib_java_cpp.so");
    }

我不确定在 flutter 中运行时应该加载哪个库。

我找到了解决这个问题的方法。 在创建 a.jar 文件和 a.so 文件后,我将 that.so 添加到文件夹android -> app -> src -> main -> jniLibs -> arm64-v8a然后我添加了这一行:

android {
...
    sourceSets {
        ...
        main.jniLibs.srcDirs += 'src/main/jniLibs'
    }
...
}

到 app/build.gradle 文件

我补充说:

set(JNI_LIBS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/app/src/main/jniLibs/${ANDROID_ABI})

add_library(lib_java_cpp
            SHARED
            IMPORTED)

set_target_properties(lib_java_cpp
            PROPERTIES IMPORTED_LOCATION
            ${JNI_LIBS_DIR}/lib_java_cpp.so)

...

到 android/CMakeLists.txt 文件。

最后我在 MainActivity 中调用System.loadLibrary("_java_cpp")来加载所需的库,并能够从使用 ZF6F87C9FDCF8B38C3F07F93FEE1 的 jar 调用 Java 函数 (调用后会自动添加库以查找正确的共享对象)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM