`

JAVA调C#的类库(dll)

    博客分类:
  • Java
阅读更多
.net产生的比java晚,其类库的封装在某些方面也比java更优秀,更全面。比如最近在做一个OJ,看到网上的一些做法是用java+c++,C++用作所提交程序的测试。c++虽然好,但是他的编写比较复杂。因此,我选择的是C#,用.net的类库可以很方便的获得一个进程(用户提交的程序)运行的时间和消耗的内存。下面是我的测试程序:

首先我在网上查了一些资料:

C# method calls within Java Program

这篇文章大概传达了这样一个意思:

Java 调用C#过程:
Java -> JNI -> C++ dll  <== Managed C++ ==> C# dll

使用C++调用C#的DLL

上面这篇文章我搜了一下,已经被转载了无数次了,关于网上c++调c# dll基本都是这篇文章
然后再用google搜一下jni的例子是一堆一堆的。

====================================================================
了解了java调c#在简单的过程,再了解了jni和c++如何调c#,这样用java调c#应该就没什么问题了.但是本人在做的时候还有一点小小的路径问题,报了一个jvm unexpected exception,让我真是郁闷了好久。


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

先写一个java类

package com.ypoj.jni;
public class TestJNI{
 public native int add(int a, int b); 
       static {      
                System.loadLibrary("CallCS");
            } 
   public static void main(String[] args) {   
              TestJNI t = new TestJNI(); 9     
               System.out.println(t.add(10, 20));
  }
 }


然后用javah命令产生.h的文件(网上jni的文章介绍的很多)

我使用的IDE是NetBeans,生成的.class文件和源文件不在同一个文件夹下,把TestJNI.class拷贝到TestJNI.java同一目录下。然后运行cmd.exe在src目录下,javah com.ypoj.jni.TestJNI

新建一个c++的类库,本人使用的是VS2008,这里需要注意的是,在刚刚讲到原理的时候是java->c++ dll->managed c++->c#,然而vc++里面已经集成了managed c++,所以其实我做的时候并没有把c++和managed c++分开来做,因为vs2008里已经集成好了,具体做法是:选择《项目》-> 《属性页》->《配置属性》->《常规》->《公共语言运行库支持》,选择公共语言运行库支持(/clr)。这样就可以了

用javah生成的com_ypoj_jni_TestJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class com_ypoj_jni_TestJNI */ 
#ifndef _Included_com_ypoj_jni_TestJNI 
#define _Included_com_ypoj_jni_TestJNI 
#ifdef __cplusplus 
extern "C" { 
 #endif 
/** Class:  com_ypoj_jni_TestJNI 
* Method:    add
* Signature: (II)I
*/JNIEXPORT jint JNICALL Java_com_ypoj_jni_TestJNI_add
(JNIEnv *, jobject, jint, jint);
 #ifdef __cplusplus17 }
 #endif
 #endif



在编译的时候会提示需要加入两个头文件,分别是jni.h和jni_md.h,这两个文件可以在你本机安装的jdk的文件夹里搜到。如果编译的时候说找不到jni.h,则include的时候写成  #include "jni.h",<>改成""。


接下来先完成C#的 Dll

using System;
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace OJMain 
{ 
public class OJEntrance 
{ 
 private int result;
  public int Result
     {
     get { return result + 10; }
     set { this.result = value; }
    }
  }
 }


最后实现C++里的那个函数

首先把生成的C#的Dll拷贝到C++源文件的同一个目录下,也就是和C++的dll,.cpp文件放在同一个目录,这里不是把C#的dll放在c++ dll同一目录(Debug目录),虽然放在Debug目录也可以(改变引入的路径),但是当用java再调的时候就会出错了。


注意:一定先把c#的dll拷到c++的项目里,然后再去写那个jni函数

c++ 主 DLL 文件

#include "stdafx.h" 
#include "jni.h" 
#include "com_ypoj_jni_TestJNI.h"
#include "CallCS.h" 
//引入c#的库和命名空间 
#using "OJMain.dll"
using namespace OJMain;
JNIEXPORT jint JNICALL Java_com_ypoj_jni_TestJNI_add 
(JNIEnv *env, jobject obj, jint a, jint b)
 {
  //c#中的对象
    OJEntrance ^o = gcnew OJEntrance();
    o->Result = a + b;
    return o->Result;
}

生成c++的dll,

最后把c#和c++的dll拷贝到library.path下,我把他们拷贝在了jdk的bin目录下


运行结果


run:
40
成功生成(总时间:0 秒)

分享到:
评论

相关推荐

    JAVA类库转换成C#类库工具

    标题"JAVA类库转换成C#类库工具"以及描述中提到的"C#引用JAVA类库"、"C#调用JAVA类库"和"C#解析JAVA类库"都涉及到一个关键的技术:IKVM。 IKVM是“Java to .NET”的一个开源实现,它允许C#或其他.NET语言直接引用和...

    java调用C#封装的dll方法

    ### Java调用C#封装的DLL方法 #### 第一种方法:Java利用JNA进行调用 **背景介绍:** 为了实现Java与C#之间的交互,一种常用的方式是通过调用C#封装的DLL文件来完成特定功能。这种方法涉及到.NET Framework与Java...

    JAVA通过JNI调用C#dll的整个项目工程

    Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...

    java调用C#封装的dll方法[归纳].pdf

    使用 C# 创建一个类库项目,生成 COMTest.dll 和 COMTest.tlb 文件。需要设置强签名,并在 AssemblyInfo.cs 文件中将 `[assembly: ComVisible(false)]` 属性改成 `[assembly: ComVisible(true)]`。 步骤 2:使用 ...

    Java调用C#的DLL实现方案.docx

    2. **创建C#类库**: 在Visual Studio中,以管理员模式启动,新建一个C#项目,选择“类库(.NET Framework)”作为项目类型。项目名称设为"Invoke",解决方案名称设为"DLL_of_CSharp_calling_by_Java",并且选择.NET ...

    java包转c#dll

    标题“java包转c#dll”涉及到的是跨平台编程中的一个重要技术,即如何将Java的类库转换为C#可以使用的动态链接库(DLL)。在Java和C#这两个不同的编程环境中,实现这样的转换有助于共享代码资源,提高开发效率。下面...

    Java调用C#的DLL实现方案.rar

    然而,JNA并不支持.NET Framework的特性,如托管代码或.NET类库,所以它不能直接调用C# DLL。 3. **P/Invoke** P/Invoke是.NET Framework提供的一种特性,允许C#代码调用非托管的DLL函数。然而,P/Invoke是单向的...

    Java调用C#DLL

    4. **C# to Java Bridge**:例如,IKVM.NET项目可以将.NET库(包括DLL)转换成Java可理解的类库,使得Java可以直接使用。但这可能需要C# DLL完全遵循公共语言运行库(CLI)规范。 5. **Java-.NET Bridge** 或 **...

    Java 调用 C# DLL

    1. **创建C# DLL**:首先,使用Visual Studio或其他C#开发工具创建一个类库项目,定义一些公开的方法和接口,然后编译生成DLL。 2. **启用COM互操作**:在C#项目中,为要暴露给Java的类启用COM互操作。在类上应用`...

    c# 调用java类库

    本话题聚焦于"C#调用Java类库",具体是利用C#来调用Java的biojava库来处理ABI文件,从而解读DNA数据。下面将详细讨论这个主题。 首先,C#与Java之间的互操作性主要通过.NET框架的Java互操作服务(也称为JNBridge或...

    java项目jar包转dll文件.net引用

    在.NET环境中,有时候我们需要将Java项目中的功能引入到C#项目中使用,这时就需要将Java的jar包转换为.NET能够识别的dll文件。这个过程主要涉及到Java与.NET之间的互操作性,具体步骤如下: 首先,我们需要了解Java...

    DotNetty类库dll文件netty的c#版

    DotNetty是一个高性能、异步事件驱动的网络应用程序框架,专为C#和.NET平台设计。它是基于Java的Netty项目的一个移植版本,为构建可伸缩、高并发的网络应用提供了强大的支持。在.NET生态系统中,DotNetty提供了一套...

    Interop.Shell32 操作类库DLL

    `Interop.Shell32`是一个.NET框架中的COM互操作库,它允许C#或Java等.NET支持的语言与Windows操作系统中的`Shell32.dll`进行交互。`Shell32.dll`是Windows Shell的主要组件,提供了对桌面环境、文件管理、快捷方式、...

    基于C#的Dll文件创建+调用

    总结来说,C#创建和调用Dll文件涉及创建类库项目、编写公共方法、设置输出类型为类库、编译项目生成Dll,以及在需要的地方通过引用或PInvoke调用Dll中的功能。理解并掌握这一过程,对于提升代码复用性和系统效率具有...

    java调用C#封装的dll方法.doc

    Java 调用C#封装的DLL方法是一个跨语言交互的技术实现,主要涉及到Java Native Interface (JNA)和Jacob库的使用。以下是两种常见的方法详细解释: ### 方法一:使用JNA **JNA(Java Native Access)**是Java平台上...

    java c# 包互转 支持java8

    "java c# 包互转 支持java8"这个主题就涉及到如何在Java和C#之间转换代码库,尤其是将Java的.jar文件转换为C#可使用的.dll文件。 标题中的“java c# 包互转”指的是Java与C#之间的互操作性技术,这通常依赖于特定的...

    Java调用C#com方法

    ### 第一种方法:Java利用JNA调用C# DLL 1. **创建C# COM组件**: - 使用Visual Studio创建一个类库项目,并定义一个接口和类,例如`COMTestIfce`和`COMTestClass`。 - 在接口中定义需要暴露给Java调用的方法,如...

    C#调用Java接口演示

    2. **Java接口转换**:IKVM.NET提供了一个工具,可以将Java类库转换为.NET兼容的DLL。你需要使用这个工具处理你的Java接口,将其转换成.NET接口。 3. **C#调用Java接口**:在C#代码中,你可以像使用普通的.NET接口...

    dll.rar_Java 生成dll_Java程序转为c#调用时需要的dll包_jdk 生成 dll

    标题“dll.rar_Java生成dll_Java程序转为c#调用时需要的dll包_jdk生成dll”揭示了这个过程的关键步骤,而描述中的“ikvm库”则是实现这一目标的关键工具。 首先,我们需要理解DLL是什么。DLL是Windows操作系统中的...

    C#调用JAVA方法

    本篇文章将详细探讨如何在C#中调用Java方法,以及与之相关的技术,包括IKVM.NET。我们将通过提供的资源,即“UseJAVA.rar”和“JAVADemo.rar”,来了解具体的实现过程。 首先,让我们理解C#调用Java方法的基本原理...

Global site tag (gtag.js) - Google Analytics