Как вызвать функцию C# из java [дубликат]
На этот вопрос уже есть ответ здесь:
вызов метода C# в программе Java
2 ответа
Мне нужно вызвать функцию C# из java, и для этого я создал следующее.
У меня есть средство проверки подлинности для создания заголовочного файла java.h, вот код:
#include <jni.h>
/* Header for class Authenticator */
#ifndef _Included_Authenticator
#define _Included_Authenticator
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Authenticator
* Method: authenticate
* Signature: (Ljava/lang/String;Ljava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL Java_Authenticator_authenticate
(JNIEnv *, jobject, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif
Я должен затем создать функцию C#, которая аутентифицирует
namespace SharpAuthenticator
{
public class Authenticator
{
public bool Authenticate(String username,String password)
{
return username == "user" && password == "login";
}
}
}
Тогда Я пытаюсь вызвать функцию C# из C++(project to create a dll), используя приведенный ниже код;
String^ toString(const char *str)
{
int len = (int)strlen(str);
array<unsigned char>^ a = gcnew array<unsigned char>(len);
int i = 0;
while (i < len)
{
a[i] = str[i];
i++;
}
return Encoding::UTF8->GetString(a);
}
bool authenticate(const char *username, const char *password)
{
SharpAuthenticator::Authenticator::Authenticate(toString(username), toString(password));
}
JNIEXPORT jboolean JNICALL Java_Authenticator_authenticate
(JNIEnv *env, jobject c, jstring name, jstring pass)
{
jboolean result;
jboolean isCopyUsername;
const char * username = env->GetStringUTFChars(name, &isCopyUsername);
jboolean isCopypassword;
const char * password = env->GetStringUTFChars(pass, &isCopypassword);
result = authenticate(username, password);
env->ReleaseStringUTFChars(name, username);
env->ReleaseStringUTFChars(pass, password);
return result;
}
И finnally создать dll, которую мне нужно вызвать из java. Dll создается, и я загружаю его хорошо в java, но я получаю этот журнал ошибок в java. Что я могу упустить?
#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (0xe0434352), pid=9708, tid=7756
#
# JRE version: 7.0-b147
# Java VM: Java HotSpot(TM) Client VM (21.0-b17 mixed mode, sharing windows-x86 )
# Problematic frame:
# C [KERNELBASE.dll+0x812f]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
1 ответ:
Прежде всего, давайте создадим файл C# следующим образом:
using System; public class Test{ public Test(){} public String ping(){ return "C# is here."; } }Затем скомпилируйте это с помощью команды ниже:
csc.exe /target:module Test.csВы можете найти
csc.exeв пути установки .NET framework. После этого создайте java-файл:public class Test{ public native String ping(); public static void main(String[] args){ System.load("/path/to/dll"); System.out.println("Java is running."); Test t = new Test(); System.out.println("Trying to catch C# " + r.ping()); } }
javac Test.javaэто порождаетTest.class.
javah -jni Testэто создает файлTest.h, который будет включен в Код C++.После этого нам нужно создать наш C++ файл:
#include "stdafx.h" #include "JAVA/Test.h" #include "MCPP/Test.h" #pragma once #using <mscorlib.dll> #using "Test.netmodule" JNIEXPORT jstring JNICALL Java_Test_ping(JNIEnv *env, jobject obj){ Test^ t = gcnew Test(); String^ ping = t->ping(); char* str = static_cast<char*>((System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(ping)).ToPointer()); char cap[128]; strcpy_s(cap, str); return env->NewStringUTF(cap); }Наконец:
c:\>java TestЯ надеюсь, что это помогает вам. Основной пример, чтобы используйте функцию C# в Java.
Comments