将 C# DLL 导入 C++ 以用于 JNI
Importing a C# DLL into C++ for use with JNI
我正在用Java编写一个程序,它必须使用DLL文件(这是用C#编写的文件(,我认为最好的方法是编写一个C++程序作为接口,然后使用JNI。C++程序将负责以 JNI 友好的方式使用 DLL,以便我可以从我的 Java 程序调用它。
我正在尝试在C++中包含DLL文件,但是在编译时遇到以下错误。
warning C4335: Mac file format detected: please convert the source file to either DOS or UNIX format
我包含所述DLL的方式:
#include "LibraryName.dll"
我以这种方式包含/使用或对 DLL 的使用做出任何不正确的假设?我将如何修复此错误?
你可以避免C++,直接从Java调用C#,然后返回,但你必须从C#端引导整个事情:
- 在 Java 程序中创建一个类并公开一个 JNI 方法:
public class Foo {
static native void bar(); // This method will be implemented in C#
}
- 将 Java 程序编译成 JAR 文件
- 用 C# 编写一个"引导程序"程序,用于加载 DLL,在进程中使用 JAR 在类路径中启动 JVM,并使用 JNI
RegisterNatives
为该方法提供回调bar()
并相应地调用 DLL。
请参阅 Apache Ignite.NET 代码作为跨平台 .NET/Java 互操作的示例:
- Java 端方法:https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/callback/PlatformCallbackUtils.java
- C# 端实现在
RegisterNatives
中提供: https://github.com/apache/ignite/blob/master/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Callbacks.cs#L120 - C#也可以调用任何Java类/方法:https://github.com/apache/ignite/blob/607cdb0dafe8cb8c6595ab776b66a1a25cba018d/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Env.cs#L126
随意复制和修改此代码以满足您的需求,Apache许可证允许这样做。
整个事情相当复杂,但它是性能最高的方法。唯一的替代方法是在单独的进程中运行 .NET 和 Java,并使用管道或其他机制进行通信。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- 通过JNI传递数据数组的最快方法是什么
- Insert函数不适用于2 if语句C++
- 将 C# DLL 导入 C++ 以用于 JNI
- SDL 中的倾斜控制,适用于 Android NDK JNI 游戏
- JNI不适用于__stdcall
- 用于包装C++对象的最佳 JNI 模式
- JNI(Java)等效于INCREF,DECREF用于C++的python嵌入
- 正在构建用于Oracle jvm的avahi(错误:jni.h未找到)