1

我需要将 C# 中的方法返回的值获取到 java 类中的变量,所以我使用了 JNI。它适用于仅在 C# 中调用一个方法,但是当我修改相同的方法和那些将值传递给 java 的相应调用时它不起作用......它显示了一个致命错误并创建了以下日志文​​件。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (0xe0434f4d), pid=4252, tid=4236
#
# JRE version: 7.0_07-b10
# Java VM: Java HotSpot(TM) Client VM (23.3-b01 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [kernel32.dll+0x1eb33]  RaiseException+0x52
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

---------------  T H R E A D  ---------------

Current thread (0x009e8800):  JavaThread "main" [_thread_in_native, id=4236, stack(0x00ad0000,0x00b20000)]

siginfo: ExceptionCode=0xe0434f4d, ExceptionInformation=0x80070002 

Registers:
EAX=0x00b1ed44, EBX=0xe0434f4d, ECX=0x00000000, EDX=0x00000028
ESP=0x00b1ed40, EBP=0x00b1ed94, ESI=0x00b1edd0, EDI=0x000c5570
EIP=0x7c81eb33, EFLAGS=0x00000202

Top of Stack: (sp=0x00b1ed40)
0x00b1ed40:   00b1edcc e0434f4d 00000001 00000000
0x00b1ed50:   7c81eb33 00000001 80070002 02000038
0x00b1ed60:   00b1ed70 79e80024 00b1ed78 02000038
0x00b1ed70:   00b1ed7c 79e80687 79330ba0 00b1ed8c
0x00b1ed80:   79eda76f 793171fc 0000012f 00b1ed9c
0x00b1ed90:   79eda796 00b1edf4 79eda91c e0434f4d
0x00b1eda0:   00000001 00000001 00b1edcc 4f14bdac
0x00b1edb0:   00000000 03b85780 00b1ee80 00ad3000 

Instructions: (pc=0x7c81eb33)
0x7c81eb13:   f9 0f 0f 87 69 5a 02 00 85 c9 89 4d c0 74 07 57
0x7c81eb23:   8d 7d c4 f3 a5 5f 8d 45 b0 50 ff 15 04 15 80 7c
0x7c81eb33:   5e c9 c2 10 00 85 ff 0f 8e e6 d0 fe ff 8b 55 fc
0x7c81eb43:   89 55 0c 0f b7 16 8b 7d f8 8a 14 3a 88 11 8b 78 


Register to memory mapping:

EAX=0x00b1ed44 is pointing into the stack for thread: 0x009e8800
EBX=0xe0434f4d is an unknown value
ECX=0x00000000 is an unknown value
EDX=0x00000028 is an unknown value
ESP=0x00b1ed40 is pointing into the stack for thread: 0x009e8800
EBP=0x00b1ed94 is pointing into the stack for thread: 0x009e8800
ESI=0x00b1edd0 is pointing into the stack for thread: 0x009e8800
EDI=0x000c5570 is an unknown value


Stack: [0x00ad0000,0x00b20000],  sp=0x00b1ed40,  free space=315k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [kernel32.dll+0x1eb33]  RaiseException+0x52
C  [mscorwks.dll+0x6a91c]  GetMetaDataInternalInterface+0x84a9
C  [mscorwks.dll+0xc9e44]  CopyPDBs+0x39f8
C  [mscorwks.dll+0x26154b]  CorLaunchApplication+0x15d35
C  [mscorjit.dll+0x2ea6]
C  [mscorjit.dll+0x717d]
C  [mscorjit.dll+0x43a1]
C  [mscorjit.dll+0x44d6]
C  [mscorjit.dll+0x465c]
C  [mscorjit.dll+0x5b8e]
C  [mscorjit.dll+0x5d33]
C  [mscorjit.dll+0x6448]
C  [mscorwks.dll+0x157198]  StrongNameErrorInfo+0x22d0c
C  [mscorwks.dll+0x15722d]  StrongNameErrorInfo+0x22da1
C  [mscorwks.dll+0x1572a0]  StrongNameErrorInfo+0x22e14
C  [mscorwks.dll+0x157019]  StrongNameErrorInfo+0x22b8d
C  [mscorwks.dll+0x156ddb]  StrongNameErrorInfo+0x2294f
C  [mscorwks.dll+0x111a3]  DllUnregisterServerInternal+0x5187
C  [mscorwks.dll+0x11363]  DllUnregisterServerInternal+0x5347
C  0x0324fb2e
C  0x0352e109
C  0x03250081
j  Test1.displayHelloWorld()Z+0
j  Test1.main([Ljava/lang/String;)V+12
v  ~StubRoutines::call_stub
V  [jvm.dll+0x12a39a]
V  [jvm.dll+0x1d962e]
V  [jvm.dll+0x12a41d]
V  [jvm.dll+0xaee94]
V  [jvm.dll+0xb9217]
C  [java.exe+0x1fd8]
C  [java.exe+0xa0cb]
C  [java.exe+0xa155]
C  [kernel32.dll+0xb50b]  GetModuleFileNameA+0x1b4

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  Test1.displayHelloWorld()Z+0
j  Test1.main([Ljava/lang/String;)V+12
v  ~StubRoutines::call_stub

---------------  P R O C E S S  ---------------

Java Threads: ( => current thread )
  0x02c7c000 JavaThread "Service Thread" daemon [_thread_blocked, id=2376, stack(0x03010000,0x03060000)]
  0x02c76400 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=608, stack(0x02fc0000,0x03010000)]
  0x02c74800 JavaThread "Attach Listener" daemon [_thread_blocked, id=4308, stack(0x02f70000,0x02fc0000)]
  0x02c73000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=4292, stack(0x02f20000,0x02f70000)]
  0x02c64400 JavaThread "Finalizer" daemon [_thread_blocked, id=4304, stack(0x02ed0000,0x02f20000)]
  0x02c5f400 JavaThread "Reference Handler" daemon [_thread_blocked, id=4288, stack(0x02e80000,0x02ed0000)]
=>0x009e8800 JavaThread "main" [_thread_in_native, id=4236, stack(0x00ad0000,0x00b20000)]

Other Threads:
  0x02c5dc00 VMThread [stack: 0x02e30000,0x02e80000] [id=4244]
  0x02c86c00 WatcherThread [stack: 0x03060000,0x030b0000] [id=4320]

VM state:not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

Heap
 def new generation   total 4928K, used 281K [0x22cc0000, 0x23210000, 0x28210000)
  eden space 4416K,   6% used [0x22cc0000, 0x22d064f0, 0x23110000)
  from space 512K,   0% used [0x23110000, 0x23110000, 0x23190000)
  to   space 512K,   0% used [0x23190000, 0x23190000, 0x23210000)
 tenured generation   total 10944K, used 0K [0x28210000, 0x28cc0000, 0x32cc0000)
   the space 10944K,   0% used [0x28210000, 0x28210000, 0x28210200, 0x28cc0000)
 compacting perm gen  total 12288K, used 112K [0x32cc0000, 0x338c0000, 0x36cc0000)
   the space 12288K,   0% used [0x32cc0000, 0x32cdc128, 0x32cdc200, 0x338c0000)
    ro space 10240K,  42% used [0x36cc0000, 0x370ff150, 0x370ff200, 0x376c0000)
    rw space 12288K,  54% used [0x376c0000, 0x37d3fad8, 0x37d3fc00, 0x382c0000)

Card table byte_map: [0x02cd0000,0x02d80000] byte_map_base: 0x02bb9a00

Polling page: 0x00b20000

Code Cache  [0x00b50000, 0x00be8000, 0x02b50000)
 total_blobs=133 nmethods=5 adapters=64 free_code_cache=32187Kb largest_free_block=32959808

Compilation events (10 events):
Event: 0.110 Thread 0x02c76400    1             java.lang.String::hashCode (55 bytes)
Event: 0.110 Thread 0x02c76400 nmethod 1 0x00bdfcc8 code [0x00bdfdc0, 0x00bdfea0]
Event: 0.122 Thread 0x02c76400    2             java.lang.String::charAt (29 bytes)
Event: 0.123 Thread 0x02c76400 nmethod 2 0x00be0288 code [0x00be0390, 0x00be04bc]
Event: 0.126 Thread 0x02c76400    3             java.lang.String::indexOf (70 bytes)
Event: 0.127 Thread 0x02c76400 nmethod 3 0x00be0608 code [0x00be0720, 0x00be085c]
Event: 0.127 Thread 0x02c76400    4             java.io.Win32FileSystem::normalize (143 bytes)
Event: 0.128 Thread 0x02c76400 nmethod 4 0x00be0988 code [0x00be0ad0, 0x00be0d6c]
Event: 0.128 Thread 0x02c76400    5             java.lang.Object::<init> (1 bytes)
Event: 0.128 Thread 0x02c76400 nmethod 5 0x00be10c8 code [0x00be11c0, 0x00be1250]

GC Heap History (0 events):
No events

Deoptimization events (0 events):
No events

Internal exceptions (2 events):
Event: 0.017 Thread 0x009e8800 Threw 0x22cc11d8 at C:\jdk7u1_32P\jdk7u7\hotspot\src\share\vm\prims\jni.cpp:3994
Event: 0.123 Thread 0x009e8800 Threw 0x22cf9b00 at C:\jdk7u1_32P\jdk7u7\hotspot\src\share\vm\prims\jvm.cpp:1166

Events (10 events):
Event: 0.124 loading class 0x02ca2820
Event: 0.125 loading class 0x02ca2820 done
Event: 0.125 loading class 0x02ca24a0
Event: 0.125 loading class 0x02ca24a0 done
Event: 0.125 loading class 0x383bd170
Event: 0.125 loading class 0x382f3788
Event: 0.125 loading class 0x382f3788 done
Event: 0.125 loading class 0x383bd170 done
Event: 0.127 loading class 0x382caa28
Event: 0.127 loading class 0x382caa28 done


Dynamic libraries:
0x00400000 - 0x0042f000     C:\windows\System32\java.exe
0x7c900000 - 0x7c9b0000     C:\windows\system32\ntdll.dll
0x7c800000 - 0x7c8f4000     C:\windows\system32\kernel32.dll
0x77dd0000 - 0x77e6b000     C:\windows\system32\ADVAPI32.dll
0x77e70000 - 0x77f01000     C:\windows\system32\RPCRT4.dll
0x77d40000 - 0x77dd0000     C:\windows\system32\USER32.dll
0x77f10000 - 0x77f56000     C:\windows\system32\GDI32.dll
0x773d0000 - 0x774d2000     C:\windows\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\COMCTL32.dll
0x77c10000 - 0x77c68000     C:\windows\system32\msvcrt.dll
0x77f60000 - 0x77fd6000     C:\windows\system32\SHLWAPI.dll
0x76390000 - 0x763ad000     C:\windows\system32\IMM32.DLL
0x629c0000 - 0x629c9000     C:\windows\System32\LPK.DLL
0x74d90000 - 0x74dfb000     C:\windows\System32\USP10.dll
0x6d590000 - 0x6d596000     C:\PROGRA~1\KASPER~1\KASPER~1.0FO\kloehk.dll
0x6d020000 - 0x6d035000     C:\PROGRA~1\KASPER~1\KASPER~1.0FO\adialhk.dll
0x78aa0000 - 0x78b5e000     C:\Program Files\Java\jre7\bin\msvcr100.dll
0x6e750000 - 0x6ea9c000     C:\Program Files\Java\jre7\bin\client\jvm.dll
0x71ad0000 - 0x71ad9000     C:\windows\System32\WSOCK32.dll
0x71ab0000 - 0x71ac7000     C:\windows\System32\WS2_32.dll
0x71aa0000 - 0x71aa8000     C:\windows\System32\WS2HELP.dll
0x76b40000 - 0x76b6d000     C:\windows\System32\WINMM.dll
0x76bf0000 - 0x76bfb000     C:\windows\System32\PSAPI.DLL
0x6e6a0000 - 0x6e6ac000     C:\Program Files\Java\jre7\bin\verify.dll
0x6d480000 - 0x6d4a0000     C:\Program Files\Java\jre7\bin\java.dll
0x6e730000 - 0x6e743000     C:\Program Files\Java\jre7\bin\zip.dll
0x10000000 - 0x1000d000     C:\module\supporting\HelloWorld.dll
0x79000000 - 0x7904a000     C:\windows\system32\mscoree.dll
0x10200000 - 0x10320000     C:\windows\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\MSVCR80D.dll
0x03110000 - 0x03212000     C:\windows\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcm80d.dll
0x774e0000 - 0x7761c000     C:\windows\system32\ole32.dll
0x603b0000 - 0x60416000     C:\windows\Microsoft.NET\Framework\v4.0.30319\mscoreei.dll
0x79e70000 - 0x7a400000     C:\windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
0x78130000 - 0x781cb000     C:\windows\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.3053_x-ww_b80fa8ca\MSVCR80.dll
0x7c9c0000 - 0x7d1d4000     C:\windows\system32\shell32.dll
0x790c0000 - 0x79bb7000     C:\windows\assembly\NativeImages_v2.0.50727_32\mscorlib\9adb89fa22fd5b4ce433b5aca7fb1b07\mscorlib.ni.dll
0x79060000 - 0x790bb000     C:\windows\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll
0x5e3a0000 - 0x5e42d000     C:\windows\Microsoft.NET\Framework\v2.0.50727\diasymreader.dll
0x0ffd0000 - 0x0fff8000     C:\windows\System32\rsaenh.dll
0x7a440000 - 0x7abc5000     C:\windows\assembly\NativeImages_v2.0.50727_32\System\aa7926460a336408c8041330ad90929d\System.ni.dll
0x59a60000 - 0x59b01000     C:\windows\System32\dbghelp.dll
0x77c00000 - 0x77c08000     C:\windows\system32\VERSION.dll

VM Arguments:
java_command: Test1
Launcher Type: SUN_STANDARD

Environment Variables:
JAVA_HOME=C:\Program Files\Java\jdk1.7.0_01
PATH=C:\windows\System32;C:\wamp\bin\php\php5.3.0;C:\wamp\bin\php\php5.3.0;C:\Program Files\Java\jdk1.6.0_18\bin;C:\windows\system32;C:\windows;C:\windows\system32\WBEM;C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;C:\wamp\bin\php\php5.3.0;C:\wamp\bin\php\php5.3.0;C:\Program Files\Java\jdk1.6.0_18\bin;C:\windows\system32;C:\windows;C:\windows\system32\WBEM;C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;C:\wamp\bin\php\php5.3.0;C:\wamp\bin\php\php5.3.0;C:\Program Files\Java\jdk1.6.0_18\bin;C:\windows\system32;C:\windows;C:\windows\system32\WBEM;C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;C:\wamp\bin\php\php5.3.0;C:\wamp\bin\php\php5.3.0;C:\Program Files\Java\jdk1.6.0_18\bin;C:\windows\system32;C:\windows;C:\windows\system32\WBEM;C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;C:\wamp\bin\php\php5.3.0;C:\wamp\bin\php\php5.3.0;C:\Program Files\Java\jdk1.6.0_18\bin;C:\windows\system32;C:\windows;C:\windows\system32\WBEM;C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;ATALINA_HOME\bin
USERNAME=sathishkumarkk
OS=Windows_NT
PROCESSOR_IDENTIFIER=x86 Family 6 Model 23 Stepping 6, GenuineIntel



---------------  S Y S T E M  ---------------

OS: Windows XP Build 2600 Service Pack 2

CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 23 stepping 6, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, tsc

Memory: 4k page, physical 2028972k(797208k free), swap 4915092k(3478568k free)

vm_info: Java HotSpot(TM) Client VM (23.3-b01) for windows-x86 JRE (1.7.0_07-b10), built on Aug 28 2012 19:49:22 by "java_re" with unknown MS VC++:1600

time: Thu Sep 06 09:45:18 2012
elapsed time: 0 seconds

这个链接我曾经尝试过 JNI,它可以工作,但是当我尝试从 C# 返回 int 或 bool 或 String 时...发生上述致命错误。

CSharpHelloWorld.cs

using System;
using System.Windows.Forms;

public class CSharpHelloWorld
{
    public CSharpHelloWorld() { }

    public int displayHelloWorld()
    {
       // MessageBox.Show("Hello Java, I'm C#!", "Sample");
       return 1;
    }
}

后来我创建了 CSharpHelloWorld.netmodule

csc /t:module CSharpHelloWorld.cs

接下来我写了Test1.java

public class Test1 { 
private native int displayHelloWorld();
    static {
        try{
            System.loadLibrary("HelloWorld");
            //System.load("D://HelloWorld.dll");
            //System.loadLibrary("CallApi");
            System.out.println("Loaded");
        }catch(UnsatisfiedLinkError e){
            //nothing to do
            System.out.println("Couldn't load");
            System.out.println(e.getMessage());
        }
    }




    public static void main (String[] args) {
        Test1 t = new Test1();
       System.out.println(t.displayHelloWorld());
    }
}

我编译它并使用 Test1.class 文件通过运行来获取 Test1.h

javah测试1

然后我写了 HelloWorldC.h ,我只是从我提到的教程中复制了它。

#using <mscorlib.dll>
#using "MCPP\CSharpHelloWorld.netmodule"

using namespace System;

public __gc class HelloWorldC
{
    public:
        // Provide .NET interop and garbage collecting to the pointer.
        CSharpHelloWorld __gc *t;
        HelloWorldC() {
            t = new CSharpHelloWorld();
            // Assign the reference a new instance of the object
        }

     // This inline function is called from the C++ Code
       int callCSharpHelloWorld() {
            int i=t->displayHelloWorld();
            printf(i);
            return i;
        }
};

最后我写了 HelloWorld.cpp

#include <jni.h>
#include "Java\Test1.h"

// The Managed C++ header containing the call to the C#
#include "MCPP\HelloWorldC.h"

// This is the JNI call to the Managed C++ Class
// NOTE: When the java header was created, the package name was not include in the JNI call.
// This naming convention was corrected by adding the 
// "helloworld" name following the following syntax: 
// Java_<package name>_<class name>_<method name>
JNIEXPORT jint JNICALL Java_Test1_displayHelloWorld  (JNIEnv *jn, jobject jobj) {

    // Instantiate the MC++ class.
    HelloWorldC* t = new HelloWorldC();


    // The actual call is made. 
    return t->callCSharpHelloWorld();
}

然后我用 Visual Studio 2005 构建它,后来我得到了 dll 文件,我复制了那个 dll 并将它传递到我的 java 类附近,然后我运行了 Test1.class

java测试1

运行后,我得到了上面提到的致命错误。

注意:我遵循了我提到的教程中提到的相同结构。

4

0 回答 0