Comment appeler la fonction C # depuis Java


MorganM

J'ai besoin d'appeler la fonction C # de java et pour cela, j'ai créé ce qui suit. J'ai créé un fichier d'en-tête java Authenticator.h, voici le code:

#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

J'ai ensuite créé une fonction C # qui authentifie

namespace SharpAuthenticator
{
    public class Authenticator
    {



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

    }
}

Ensuite, j'essaye d'appeler la fonction C # à partir de C ++ (projet pour créer une dll) en utilisant le code ci-dessous;

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

Et enfin créer une dll que je dois appeler à partir de java. La dll est créée et je la charge bien en java mais j'obtiens ce journal d'erreurs en java. Que pourrais-je manquer.

#
# 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
fantôme

Tout d'abord, créons un fichier C # comme celui-ci:

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

Puis compilez ceci avec la commande ci-dessous:

csc.exe /target:module Test.cs  

Vous pouvez trouver csc.exedans le chemin d'installation de .NET Framework. Après cela, créez un fichier 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.javaCela génère un fichier Test.class.

javah -jni TestCela génère un Test.hfichier qui sera inclus dans le code C ++.

Après cela, nous devons créer notre fichier 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);
}

Finalement:

c:\>java Test

J'espère que ceci vous aide. Un exemple basique d'utilisation de la fonction C # en Java.

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

Articles connexes


Comment appeler la fonction javascript depuis java?

Mehul Prajapati J'ai une bibliothèque Android native, qui attend une fonction java qui fonctionne comme un événement. Mais dans mon plugin nativescript, je veux passer la fonction javascript à la bibliothèque afin que les événements de la bibliothèque soient d

Comment appeler la fonction C depuis R?

Yester Comment pouvez-vous utiliser une fonction écrite en C à partir du niveau R en utilisant des données R. par exemple. pour utiliser une fonction comme: double* addOneToVector(int n, const double* vector) { double* ans = malloc(sizeof(double)*n); f

Appeler la fonction c depuis Java

Ali Irawan: Comment appeler la fonction c depuis Java. Semble que c est basé sur un compilateur. Je voudrais appeler la fonction C dans Windows à partir de Java, et la fonction GCC de Java également. Une référence? Jonas: Jetez un œil à Java Native Interface:

Comment appeler la fonctionnalité C ++ depuis Java

Janusz: J'ai un programme Java qui est principalement une interface graphique et qui affiche des données écrites dans un fichier xml à partir d'un outil de ligne de commande c ++. Maintenant, je veux ajouter un bouton au programme java pour actualiser les donn

Rhino: Comment appeler la fonction JS depuis Java

instantsetsuna: J'utilise Mozilla Rhino 1.7r2 (pas la version JDK) et je souhaite appeler une fonction JS depuis Java. Ma fonction JS est comme ceci: function abc(x,y) { return x+y } Comment puis-je faire cela? Edit: (La fonction JS est dans un fichier sépa

comment appeler la fonction javascript depuis Android

Vicky Maintenant, je vais afficher le graphique à barres dans la vue Web à l'aide du code ci-dessous a montré le graphique à barres. public class sample extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.on

Comment appeler la fonction Go depuis Python

Naren P J'essaie d'appeler la fonction go lang à partir de python lorsque j'appelle mon programme python, je vois l'erreur suivante. Je fais référence au lien Aller à pythn . Programme Python from ctypes import * def call_go_function(): lib =

Appeler la fonction MongoDB depuis Java

Emil C J'essaie d'appeler une fonction JavaScript stockée à partir du pilote Java MongoDB. J'ai suivi ce guide pour stocker la fonction sur le serveur DB et je suis capable d'appeler la fonction à partir du shell mongo et de renvoyer le résultat. Cependant, je

Appeler la fonction C depuis Golang

xakepp35: Je veux écrire la logique des contrôleurs et gérer json et les bases de données dans Golang, tout en ayant mon modèle de traitement mathématique en C.À mon avis, la surcharge d'appel de la fonction C doit être aussi faible que celle des registres de