java - jni4net 无法在 Java 应用程序中加载 DLL

标签 java c# .net dll jni4net

我正在尝试修改jni4net示例代码MyCSharpDemoCalc,并使该示例成为.Net DLL和Java层之间的桥梁。这是 C# 代码:

using System;
using Dynamsoft.DotNet.TWAIN;

namespace MyCSharpDemoCalc
{
    public interface ICalc
    {
        int MySuperSmartFunctionIDontHaveInJava(string question);
        bool IsShowUI();
    }

    public class DemoCalc : ICalc
    {
        private readonly Random r = new Random();
        private DynamicDotNetTwain dynamicDotNetTwain;

        public DemoCalc()
        {
            dynamicDotNetTwain = new Dynamsoft.DotNet.TWAIN.DynamicDotNetTwain();
        }

        public int MySuperSmartFunctionIDontHaveInJava(string question)
        {

            if (question == "Answer to the Ultimate Question of Life, the Universe, and Everything")
            {
                return 42;
            }
            return r.Next();
        }

        public bool IsShowUI()
        {
            return dynamicDotNetTwain.IfShowUI;
        }
    }
}

为了成功构建它,我添加了以下引用:

  • 系统.Windows.Forms
  • 动态DotNetTWAIN

然后输入命令

proxygen.exe MyCSharpDemoCalc.dll -wd work

生成MyCSharpDemoCalc.j4n.jarMyCSharpDemoCalc.j4n.dll

现在,我可以导入 DynamicDotNetTWAIN.dll、MyCSharpDemoCalc.j4n.dll、jni4net.n.w64.v20-0.8.6.0.dll、jni4net.n-0.8.6.0.dll、jni4net.j-0.8.6.0。 jar 和 MyCSharpDemoCalc.j4n.jar 到 Java 项目。

Java代码:

import net.sf.jni4net.Bridge;

import java.io.IOException;

import mycsharpdemocalc.DemoCalc;
import mycsharpdemocalc.ICalc;

public class Program {
    public static void main(String arsg[]) throws IOException {
        Bridge.setClrVersion("v20");
        Bridge.init();
        Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("DynamicDotNetTWAIN.dll"));
        Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("MyCSharpDemoCalc.j4n.dll")); // crashed

        ICalc calc = new DemoCalc();
        final int result = calc.MySuperSmartFunctionIDontHaveInJava("Answer to the Ultimate Question of Life, the Universe, and Everything");

        System.out.printf("Answer to the Ultimate Question is : " + result);
        System.out.printf("If show UI : " + calc.IsShowUI());
    }
}

当我尝试运行该应用程序时,它崩溃了

Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("MyCSharpDemoCalc.j4n.dll"));

Exception in thread "main" System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
   at System.Reflection.Module._GetTypesInternal(StackCrawlMark& stackMark)
   at System.Reflection.Assembly.GetTypes()
   at net.sf.jni4net.utils.Registry.RegisterAssembly(Assembly assembly, Boolean bindJVM, ClassLoader classLoader)
   at net.sf.jni4net.Bridge.RegisterAssembly(Assembly assembly, ClassLoader classLoader)
   at net.sf.jni4net.Bridge.LoadAndRegisterAssemblyFromClassLoader(File assemblyFile, ClassLoader classLoader)
   at net.sf.jni4net.Bridge.LoadAndRegisterAssemblyFrom(File assemblyFile)
   at net.sf.jni4net.__Bridge.LoadAndRegisterAssemblyFrom3(IntPtr __envp, JniLocalHandle __class, JniLocalHandle assemblyFile)
    at net.sf.jni4net.Bridge.LoadAndRegisterAssemblyFrom(Native Method)
    at com.main.Program.main(Program.java:68)

我该如何解决这个问题?谢谢!

最佳答案

JNI4NET 将尝试从 JNI4NET 库所在的位置加载镜像,唯一的解决方法(AFAIK)是将整个库复制到源目录,并使用复制的库编译包,然后它将工作.

关于java - jni4net 无法在 Java 应用程序中加载 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24448597/

相关文章:

c# - Access 数据库引擎的优点和缺点。 SQLite 之后的生活

c# - 如何使用httpClient在没有太多请求的情况下循环通过rest api

.net - 有没有办法通过 WCF 中的单个 TCP 连接进行真正的双向通信?

.net - 如何创建共享方法的扩展

.net - 以编程方式修剪MP3

java - 我们如何 fork opencv-android repo 并在自己的项目中使用它?

java - 如何实现基于多个比较器的 add() 排序列表;参数化比较器?

java - 使用嵌套对象执行 Collections.sort() 时如何处理空值?

java - 如何在android中将textview设置为方法输出?

c# - 将整数数组传递给 ASP.NET Web API?