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

Posted

技术标签:

【中文标题】csharp 到 java JNI 移植调用以在 ubuntu 上运行【英文标题】:csharp to java JNI porting call to run on 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,所以我不知道你的错误是什么,也许你可以发布一个简短的摘要,这样每个人都会知道你在说什么。 【参考方案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

以上是关于csharp 到 java JNI 移植调用以在 ubuntu 上运行的主要内容,如果未能解决你的问题,请参考以下文章

Java 性能调优、JNI 内存泄漏

深入浅出 - Android系统移植与平台开发- Android JNI机制

使用JNA,让java调用原生代码

Mac下Java JNI (java native interface)调C

JNI 实战全面解析

JNI 实战全面解析