Sping Boot 应用程序中的Delta Chat Rust集成

v6ylcynt  于 2023-03-02  发布在  其他
关注(0)|答案(2)|浏览(137)

我目前正在构建一个Spring Boot应用程序,我想通过IMAP上的聊天发送一些邮件。Deltachat实现了COI。DeltaChat提供了一个用RUST编写的API。https://github.com/deltachat/deltachat-core-rust
如此处所示https://support.delta.chat/t/bindings-for-java/970
Java绑定应由Android应用程序https://github.com/deltachat/deltachat-android/tree/master/src/com/b44t/messenger实现
另外,我需要启动JNI:https://github.com/deltachat/deltachat-android/tree/master/jni
我把jni和messenger这两个文件夹和deltachat-core-rust Projekt一起复制到了一个单独的java项目中。但是,我不知道如何将Java类连接到C代码中。最好的方法是什么?在JNI文件夹中仍然有www.example.com类,我必须自己实现那里实现的内容吗?Android.mk class, do I have to implement what is implemented there myself?
更新:
现在我已经使用以下代码创建了共享库:

cmake_minimum_required(VERSION 3.16)
project(deltachat LANGUAGES C)
find_package(JNI REQUIRED)

# generate libnative.jnilib
include_directories(${JNI_INCLUDE_DIRS} )

add_library(native MODULE dc_wrapper.c ${CMAKE_CURRENT_SOURCE_DIR}/deltachat-core-rust/deltachat-ffi/deltachat.h)
#set_target_properties(native PROPERTIES SUFFIX ".jnilib")
target_link_libraries(native ${JNI_LIBRARIES} )
target_link_libraries(native ${CMAKE_CURRENT_SOURCE_DIR}/deltachat-core-rust/target/release/libdeltachat.a)

是这样吗?
当我尝试运行这个:

import messenger.DcContext;

public class MainJni {

    static {
        System.loadLibrary("native");
    }

    public static void main(String[] args) {
        DcContext dcContext = new DcContext("ubuntu", "example.db");

        if(dcContext == null){

        }
    }

}

我得到这个错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/robin/Documents/DeltaChatCoreJavaBindings/src/jni/build/libnative.so: /home/robin/Documents/DeltaChatCoreJavaBindings/src/jni/build/libnative.so: undefined symbol: SSL_get_error
    at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
    at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2442)
    at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2498)
    at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2694)
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2659)
    at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
    at java.base/java.lang.System.loadLibrary(System.java:1873)
    at MainJni.<clinit>(MainJni.java:6)

有什么建议吗?

g52tjvyc

g52tjvyc1#

dc_wrapper.c文件包含Java_com_b44t_*的C函数,这些函数在相应的Java package中实现native方法。
为了让它在任何平台上工作,你需要创建一个构建系统(Make,CMake,Xmake,Ninja,...):
1.将Rust crate编译为静态库;
1.将dc_wrapper.c编译为与rust crate链接的动态可加载库。
最后,您可以使用Java中的com.b44t.messenger.*类,它应该会自动加载在第二步中创建的库。android.mk文件主要是特定于android的编译选项,因此您不应该过于关注它。

e3bfsja2

e3bfsja22#

您可以尝试https://github.com/angelo-fuchs/dc-jni-playground,它目前没有维护,但它可以给予您一些提示,使其工作。
这个repo是一种尝试,它使java绑定可以独立使用,而不仅仅是在deltachat android源代码中使用。

相关问题