csharp для вызова JNI портирования Java для запуска на Ubuntu - PullRequest
0 голосов
/ 02 января 2012

Я получаю ошибку: произошел сбой вне виртуальной машины Java в собственном коде . всякий раз, когда я запускаю файл класса с собственной библиотекой и файлом модуля .net, он работает нормально. но когда я пытаюсь запустить один файл класса и нативную библиотеку, происходит сбой. пожалуйста, уточните мою ошибку, которую я сделал, пожалуйста, просмотрите мой код. для справки с параметром

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

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

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

сохранить как Sum.cs и скомпилировать его в модуль используя cmd:

csc / t: модуль 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

создать проект win32 с помощью visual studio (я использовал 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). файл библиотеки.

1 Ответ

1 голос
/ 04 января 2012

Чтобы использовать сборки .NET из Java, я настоятельно рекомендую вам взглянуть на IKVM - виртуальную машину Java, которая соединяется с .NET Runtime.

Я использовал это еще в (я думаю) в 2004 году для производства программного обеспечения, и оно работало хорошо. В настоящее время проект активно поддерживается и получает поддержку .NET 4 и Java 7.

У вас есть выбор

  • запуск кода Java в IKVM, чтобы вы могли использовать библиотеки .NET
  • запустить программу .NET, которая загружает библиотеки Java (например, jars)

В обоих случаях существует шаг предварительной обработки для перевода jar-файлов в DLLS или наоборот.

См. http://ikvm.net

...