【问题标题】:csharp to java JNI porting call to run on ubuntucsharp 到 java JNI 移植调用以在 ubuntu 上运行
【发布时间】:2012-01-31 18:22:33
【问题描述】:

我遇到了错误:在 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.h

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

包含头文件和 C#.net 模块 编写用于管理 C++ 转换的标头

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

#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/包含目录路径 构建项目。 我们将获取 JSample DLL

运行项目 与 C#.net 模块、本地 DLL 文件和类文件在同一文件夹中。

java 测试

25

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

【问题讨论】:

  • 为了简化您的示例,您无需在任何地方创建(或释放)对象。我只有一个可以运行的 Linux,所以我不知道你的错误是什么,也许你可以发布一个简短的摘要,这样每个人都会知道你在说什么。

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


【解决方案1】:

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

我在(我认为)2004 年将它用于生产软件,并且效果很好。该项目目前得到积极维护,并获得对 .NET 4 和 Java 7 的支持。

你可以选择

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

两种方式都有一个预处理步骤将 jar 转换为 DLLS,反之亦然。

http://ikvm.net

【讨论】:

  • 感谢 sehe 的回复,但我的目标是让 .net 管理代码来完成能够在没有 .net 运行时环境的 win32 系统上运行的非托管代码(纯 win32 库)。到目前为止,ubuntu 是我的第二个 .so 文件,它通常只能在基于 linux 的系统上运行。
  • @arunkumarnonascii:我不知道你想说什么,但 IKVM Mono (.NET) 在 Linux 上运行良好。我已经在 linux 上的 IKVM 上运行了整个 Eclipse IDE,以使用来自 Eclipse 插件的托管代码......我自己几乎只使用 Ubuntu
猜你喜欢
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
相关资源
最近更新 更多