如何从java调用C#函数[重复]

Posted

技术标签:

【中文标题】如何从java调用C#函数[重复]【英文标题】:How to call C# function from java [duplicate] 【发布时间】:2015-11-18 11:38:50 【问题描述】:

我需要从 java 调用 C# 函数,为此我创建了以下内容。 我创建了一个 java 头文件 Authenticator.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# 函数(创建 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;

最后创建一个我需要从 java 调用的 dll。创建了 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

【问题讨论】:

检查这个:***.com/questions/8181344/… @phantom 我没有太多使用 C++ 的知识。可以帮助我如何从 C++ 调用 C# 函数 我会尝试但不是现在可能在 2 小时内。 我会很高兴,我已经尝试了过去两天,但无法得到解决方案 看看这个,***.com/questions/18474398/… 看起来很简单 【参考方案1】:

首先让我们创建一个像这样的 C# 文件:

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

然后用下面的命令编译它:

csc.exe /target:module Test.cs  

您可以在 .NET 框架的安装路径中找到csc.exe。之后创建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

我希望这对你有帮助。在 Java 中使用函数 C# 的基本示例。

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

【讨论】:

我已经创建了 C# 和 java 文件并编译了我的问题是 C++ 的这一部分我在哪里包含它#using "Test.netmodule" 我正在使用 Visual Studio 2013 我仍然收到此错误 # Java 运行时环境检测到致命错误:## 内部错误 (0xe0434352),pid=5800,tid=5792 ## JRE 版本:7.0-b147 # Java VM: Java HotSpot(TM) Client VM (21.0-b17 混合模式, 共享 windows-x86 ) # 有问题的框架: # C [KERNELBASE.dll+0x812f] # # 无法写入核心转储。在 Windows 的客户端版本上默认不启用 Minidumps # # 包含更多信息的错误报告文件保存为:

以上是关于如何从java调用C#函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从后面的 C# 代码调用 JavaScript [重复]

从Java调用SQL函数并设置参数[重复]

在java中从另一个调用一个构造函数[重复]

C#中子类构造函数中如何调用父类构造函数

如何从 Java 应用程序调用 GraphQL 端点 [重复]

如何随机调用函数unity c# [重复]