当前位置: 首页 > 知识库问答 >
问题:

IKVM编译的DLL中的IllegalArgumentException

马淳
2023-03-14

快速总结:

我的IKVM编译的JAR-to-DLL库与.NET项目中的一些方法和类一起工作,但一个特定的库抛出了一个异常,似乎表明我的IKVM.Runtime.jni试图将一个64位地址存储到一个32位变量中,而我希望整个系统是32位的。这会引发IllegalArgumentException。

汇编

首先,我编译log4j JAR:

~>ikvmc -target:library log4j-1.2.14.jar

IKVM.NET Compiler version 7.3.4830.0
Copyright (C) 2002-2013 Jeroen Frijters
http://www.ikvm.net/

note IKVMC0002: Output file is "log4j-1.2.14.dll"
warning IKVMC0100: Class "javax.jms.MessageListener" not found
...

大约有20个左右的警告处理javax.jms.*和javax.mail.*,但它似乎可以很好地编译。

~>ikvmc -platform:x86 -target:library -classloader:ikvm.runtime.ClassPathAssemblyClassLoader -r:log4j-1.2.14 { commons-io-1.4.jar } { commons-lang3-3.1.jar } { EngineAPI_PC-1.0.13.jar } { EngineAPI_PC-api-1.0.13.jar } { guice_no_aop-3.0.jar } { guice-assistedinject-3.0.jar } { inject-330.jar } { IVectorsMultiSpeaker4GResources-1.0.1.jar } { IVectorsResources-1.0.6.jar } { slf4j-api-1.7.2.jar } { slf4j-log4j12-1.7.2.jar }
IKVM.NET Compiler version 7.3.4830.0
Copyright (C) 2002-2013 Jeroen Frijters
http://www.ikvm.net/

warning IKVMC0126: Found assembly "log4j-1.2.14" using legacy search rule, pleas
e append '.dll' to the reference
note IKVMC0002: Output file is "commons-io-1.4.dll"
note IKVMC0002: Output file is "commons-lang3-3.1.dll"
note IKVMC0002: Output file is "EngineAPI_PC-1.0.13.dll"
note IKVMC0002: Output file is "EngineAPI_PC-api-1.0.13.dll"
note IKVMC0002: Output file is "guice_no_aop-3.0.dll"
note IKVMC0002: Output file is "guice-assistedinject-3.0.dll"
note IKVMC0002: Output file is "inject-330.dll"
note IKVMC0002: Output file is "IVectorsMultiSpeaker4GResources-1.0.1.dll"
note IKVMC0002: Output file is "IVectorsResources-1.0.6.dll"
note IKVMC0002: Output file is "slf4j-api-1.7.2.dll"
note IKVMC0002: Output file is "slf4j-log4j12-1.7.2.dll"
warning IKVMC0112: Emitted java.lang.IllegalAccessError in "es.agnitio.core3.Voi
ceSampleImpl.getIdentifiableData()Ljava.util.List;"
    ("Try to access class es.agnitio.core3.a from class es.agnitio.core3.VoiceSa
mpleImpl")
    (in EngineAPI_PC-1.0.13.dll)
warning IKVMC0112: Emitted java.lang.IllegalAccessError in "es.agnitio.core3.Voi
ceSampleImpl.getIdentifiableData()Ljava.util.List;"
    ("Try to access method es.agnitio.core3.a.<init>(Les.agnitio.core3.VoiceSamp
leImpl;Les.agnitio.core3.IdentifiableData;)V from class es.agnitio.core3.VoiceSa
mpleImpl")
    (in EngineAPI_PC-1.0.13.dll)
    null

我的项目有一个app.config,其中设置了ikvm:java.library.path和ikvm:java.class.path:

<appSettings>
    <add key="ikvm:java.library.path" value="C:\path\to\DLLs\for\JNI;" />
    <add key="ikvm:java.class.path" value="C:\path\to\config;C:\path\to\license;" />
</appSettings>

app.config还具有所有IKVM库的程序集绑定。

编译和运行项目

[17:42:38.76691 ] loadLibrary: C:\path\to\DLLs\for\JNI\predj.dll, class loader: ikvm.runtime.ClassPathAssemblyClassLoader@3EDD7A7
[17:42:38.80491 ] Library loaded: C:\path\to\DLLs\for\JNI\predj.dll, handle = 0xF800000
*** exception in native code ***
java.lang.IllegalArgumentException: Can not set long field es.agnitio.data.Nativ
eMemoryJNI.ptrAddress to es.agnitio.core.ArrayForNativeCode
System.Collections.ListDictionaryInternal
Can not set long field es.agnitio.data.NativeMemoryJNI.ptrAddress to es.agnitio.
core.ArrayForNativeCode

   at __<Setter>(IReflectionException , Object , Int64 , Object )
   at IKVM.NativeCode.sun.reflect.ReflectionFactory.FieldAccessorImplBase.FieldA
ccessor`1.lazySet(Object obj, T value)
   at IKVM.NativeCode.sun.reflect.ReflectionFactory.FieldAccessorImplBase.FieldA
ccessor`1.lazySet(Object obj, T value, FieldAccessor`1 acc)
   at IKVM.NativeCode.sun.reflect.ReflectionFactory.FieldAccessorImplBase.LongFi
eld.setLong(Object obj, Int64 value)
   at IKVM.Runtime.JNIEnv.SetLongField(JNIEnv* pEnv, IntPtr obj, IntPtr fieldID,
 Int64 val)
   at es.agnitio.ivectors.IVectorsNative.updateStreaming4GSessionS(ArrayForNativ
eCode afnc1, ArrayForNativeCode afnc2, ArrayForNativeCode afnc3)
   at es.agnitio.ivectors.h.b(FeaturesNoJNA fnjna)
   at es.agnitio.core3.internal.d.a(FrontEndResult fer, Int32 i1, Int32 i2)
   at es.agnitio.core3.internal.d.a(Int32 i1, Int32 i2, List l)
   at es.agnitio.core3.internal.b.extractVoiceSamples(Int32 i, List l)
   at es.agnitio.core3.internal.b.extractVoiceSamples(Int32 i)
   at es.agnitio.core3.internal.b.extractVoiceSample(List l)
   at es.agnitio.modeling.ModelFactoryAbstract.a(List , List , List )
   at es.agnitio.modeling.ModelFactoryAbstract.trainModelFromAudio(AudioStandard
 as, List l)
   at es.agnitio.modeling.ModelFactoryAbstract.trainModelFromAudio(AudioStandard
 as)
   at BS3Test.Program.Main(String[] args) in C:\path\to\source\Program.cs:line 38

<罢工> 看起来Agnitio库将某个对象的地址存储在一个32位变量中,但IKVM库方法将其转换为一个64位地址,因此出现了IllegalArgumentException。网上的很多文档都说ikvm-native-*.dll决定JNI调用是以32位还是64位的方式进行,但我的jvm.dll或ikvm-native-win32-x86.dll似乎根本没有参与这个过程。对于如何解决这个问题(或者集成这个JAVA库的更好方法)有什么想法吗?

编辑:我最初的印象是不正确的。Ikvm-native-win32-x86.dll和jvm.dll在其32位版本中成功地包含在项目中。我现在有点不知道错误信息是什么了。

共有1个答案

傅增
2023-03-14

这很可能是本机代码中的bug。看起来它试图设置字段NativeMemoryJNI.ptrAddress,但它传递的是一个ArrayForNativeCode类型的对象,而不是NativeMemoryJNI(或子类)。

 类似资料:
  • 我很难尝试将我的.jar库转换为.dll并使其通过IKVM框架工作。我编写了一个Java库,由于它已经在几个Java项目中进行了成功的测试,所以运行良好,但我强烈需要.NET的.dll。 启动命令时: 一切都是好的(我也尝试了一个主文件,以确定:它可以工作)。 但是,当我键入: 我得到了很多警告,但它仍然创建了.dll文件。很重要的一点是,所有的警告都与我在项目中没有使用的库有关,但我很确定我在M

  • 我正在开发一个Unity(Unity3D 5.3.5F1)项目,使用IKVM8.1RC0转换成dll的Java库(另外使用VS进行C#开发) 我将几个相关的JAR转换为一个dll文件。转换序列时没有警告或错误。并将它们放入Unity Project的资产文件夹中。 因此,在调用val2.run()之前,我通过使用debug.log()检查var2==null和var2.equals(null),测

  • 问题内容: 我已经看到了一些关于此的文章,但是到目前为止,我还没有看到任何解决方案。我有一个.jar文件,正在通过IKVM转换为.NET DLL 。我试图找出如何使excel VBA环境中的DLL中的方法可用。这是详细信息。 1.)安装IKVM并将其DLL注册到GAC 2.)运行IKVM创建一个.net .dll(mytest.dll) 3.)注册了新的.dll 4.)从这里我创建了一个VB.NE

  • 我正在使用IKVM将java jar文件转换为C#DLL。这个jar文件有几个依赖项,我通过-r:reference.dll引用了所有这些依赖项。 类“org.eclipse.swt.widgets.control”是在“org.eclipse.swt.win32.win32.x863.5.2.v3557f.dll”中声明的,在使用ikvm将其编译为DLL时,该类没有错误。 提前致谢

  • 我有一些Java应用程序和一个客户,他们有一些UWP应用程序,用C#实现,通过Windows商店等分发,他们想使用我的应用程序的一些部分。这些部分完全独立于操作系统,只解析一些特殊的二进制文件格式,应用一些使用YAML文件和东西配置的业务逻辑。没有网络、GUI,只有一些文件访问等。 我们目前使用IKVM使C#可以使用感兴趣的代码,但已经遇到了不同的问题。有些支持.NET核心,有些与发行版中的本机工

  • 本文向大家介绍C#实现将javascript文件编译成dll文件的方法,包括了C#实现将javascript文件编译成dll文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现将javascript文件编译成dll文件的方法。分享给大家供大家参考,具体如下: 第一步:新建项目 添加js文件 写个测试Function (JScript.js) 单击JS文件属性。将 生成操作 改