2015-11-18 24 views
8

Java'dan C# işlevini çağırmam gerekiyor ve buna aşağıdakileri oluşturdum. Ben bir java başlık dosyası Authenticator.h oluşturmak var burada kod şudur:Java'dan C# işlevi nasıl çağırılır

#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 

Ben o zaman kimlik doğrulaması Sonra

namespace SharpAuthenticator 
{ 
    public class Authenticator 
    { 



     public bool Authenticate(String username,String password) 
     { 
      return username == "user" && password == "login"; 
     } 

    } 
} 

C# işlevi çağırmak için çalışıyorum bir C# fonksiyonunu oluşturmak Aşağıdaki kodu kullanarak C++ (proje oluşturmak için bir 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; 
} 

Ve son olarak java'dan aramam gereken bir dll oluşturun. Dll oluşturuldu ve ben java'da iyi yüklüyorum ama bu hata kaydını java'da alıyorum. Ne eksik olabilirdim. .NET framework yolunu yüklemek içinde csc.exe bulabilirsiniz

csc.exe /target:module Test.cs 

:

using System; 
public class Test{ 
    public Test(){} 
    public String ping(){ 
    return "C# is here."; 
    } 
} 

Ardından aşağıdaki komut ile bu derleme: Herşeyden

# 
# 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

et Bu: http://stackoverflow.com/questions/8181344/calling-c-sharp-method-within-a-java-program – phantom

+0

@phantom kullanıyorum çok bilgiye sahip değilsin C++. C++ C++ – MorganM

+0

dan nasıl çağırabileceğimi bana yardımcı olabilir, ama şimdi 2 saat içinde deneyeceğim. – phantom

cevap

2

Öncelikle böyle bir C# dosyası oluşturmanızı sağlar . Bundan sonra java dosyası oluşturmak:

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 Bu Test.class üretir.

javah -jni Test Bu, C++ koduna dahil edilecek bir Test.h dosyası oluşturur. Nihayet

#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); 
} 

: Bu size yardımcı olur umarım

c:\>java Test 

Bundan sonra bizim C++ dosyası oluşturmak gerekir. Java'da C# işlevini kullanmanın temel bir örneği.

Kaynaklar: https://www.quora.com/How-common-is-the-problem-of-calling-C-methods-from-Java-Do-many-developers-come-across-such-necessity

+0

C# ve java dosyasını oluşturdum ve derlediğim benim problemim C++ bu bölümünü #using "Test" i içeriyor.netmodule" – MorganM

+0

Am hala # Önemli bir hata Java Runtime Environment tarafından tespit edildiğini, bu hatayı almaya görsel stüdyo 2013 kullanıyorum: # # Dahili Hata (0xe0434352), pid = 5800, tid = 5792 # # JRE sürümü : 7.0-b147 # Java VM: Java HotSpot (TM) Müşteri VM (21.0-B 17 karma mod, pencere-x 86 paylaşımı) # Problemli çerçevesi # C [KERNELBASE.dll + 0x812f] # başarısız # yazma çekirdek dökümü.Kurulumlar, Windows istemci sürümlerinde varsayılan olarak etkin değildir. # # Daha fazla bilgi içeren bir hata raporu dosyası aşağıdaki gibi kaydedilir: – MorganM

İlgili konular