csharp到java JNI移植调用在ubuntu上运行

时间:2012-01-02 10:50:50

标签: c# java ubuntu managed-c++

我遇到错误:崩溃发生在Java虚拟机的本机代码之外。每当我使用本机库和.net模块文件运行类文件时,它工作正常。 但是当我尝试单独运行类文件和本机库时,它会崩溃。请说明我的错误,请查看我的代码。 供参考

参考

==========================================

 public class Sum
    {
        public int add(int a, int b)
        {
            return a + b;
        }
    }

===========================================

另存为Sum.cs并将其编译为模块 使用cmd:

  

csc / t:module sum.cs

创建Java文件以进行测试

===========================================

public class test{
public native int add(int a,int b);
 static {
        System.loadLibrary("JSample");
    }

    public static void main (String[] args) {
       System.out.println(new test().add(10,15));
    }
}

==========================================

将其保存为test.java编译为

  

javac test.java

创建本机头文件

  

javah -jni test

它将创建test.h

使用visual studio创建win32项目(我使用的是VS2010) 选择项目名称为JSample

包含header和C#.net模块 为manged C ++转换写标题

============================================== < / p>

#using <mscorlib.dll>
#using "Sum.netmodule"
using namespace System;
public __gc class SumC
{
public:
    Sum __gc *t;
    SumC()
    {
        t = new Sum();          
    }
    int callCSharpSum(int a,int b)
    {
        return  t->add(a,b);
    }
};

===========================================

将其另存为sum.h

创建sum.cpp文件

============================================

#include <jni.h>
#include "test.h"
#include "sum.h"

JNIEXPORT jint JNICALL Java_test_add
    (JNIEnv *, jobject, jint a, jint b)
{
    SumC* t = new SumC();  
    return t->callCSharpSum(a ,b );
}

=============================================

优化编译器以构建/ clr:oldSyntax 包括Jdk / Include目录路径 建立项目。 我们将获取JSample DLL

运行该项目 使用C#.net模块,本机DLL文件和同一文件夹中的类文件。

  

java test

25

但每当我使用 dll文件和类文件运行代码时。 它显示错误报告崩溃发生在本机代码中的Java虚拟机之外。 请说明如何将托管代码C#移植到C ++(Win32 Un-Managed代码)中。库文件。

1 个答案:

答案 0 :(得分:1)

要使用Java中的.NET程序集,我强烈建议您查看IKVM,它是一个桥接到.NET Runtime的Java VM。

我已经在(我认为)2004中使用了这个用于生产软件并且它工作得很好。该项目得到了积极维护,并且最近获得了对.NET 4和Java 7的支持。

您可以选择

  • 在IKVM中运行Java代码,以便您可以使用.NET库
  • 运行一个加载java库(例如jars)的.NET程序

两种方式都有预处理步骤将罐子翻译成DLLS或反之亦然。

请参阅http://ikvm.net