我目前正在构建一个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)
有什么建议吗?
2条答案
按热度按时间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的编译选项,因此您不应该过于关注它。e3bfsja22#
您可以尝试https://github.com/angelo-fuchs/dc-jni-playground,它目前没有维护,但它可以给予您一些提示,使其工作。
这个repo是一种尝试,它使java绑定可以独立使用,而不仅仅是在deltachat android源代码中使用。