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 上运行的主要内容,如果未能解决你的问题,请参考以下文章
深入浅出 - Android系统移植与平台开发- Android JNI机制