Java 调用 C#

来源:互联网 发布:linux 启动文件丢失 编辑:程序博客网 时间:2024/06/18 11:16


一 . 创建 C# 项目 CSharpDll


使用 Visual Studio 2017 创建 C# 之 “类库(.Net Framework )” 工程: CSharpDll ,并添加代码:


using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CSharpDll{    public class Calculate    {        public int add(int a, int b)        {            Console.WriteLine("In C# , add method has been called.");            return a + b;        }    }}

"生成" -- "配置管理器",  "配置" 选 "Release", "平台" 选 "Any CPU", 进行项目生成,工程目录的 bin / Release 下得到两个文件, CSharpDll.dll 和 CSharpDll.pdb 


二 . 创建 Java 项目 TestJNI 


1. 添加类文件 TestJNI.java 以及代码 :


public class TestJNI{    static    {        System.loadLibrary("CppWrap");    }    public native int add(int a, int b);    public static void main(String[] args)    {        TestJNI testJNI = new TestJNI();        System.out.println(testJNI.add(15, 26));    }}


2. 按照思维方向,下面要实现这里的 public native int add(int a, int b) ,


用命令行切换到 TestJNI.java 文件所在目录执行命令:

> javah TestJNI


生成文件 TestJNI.h , 其内容如下 :

/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class TestJNI */#ifndef _Included_TestJNI#define _Included_TestJNI#ifdef __cplusplusextern "C" {#endif/* * Class:     TestJNI * Method:    add * Signature: (II)I */JNIEXPORT jint JNICALL Java_TestJNI_add  (JNIEnv *, jobject, jint, jint);#ifdef __cplusplus}#endif#endif

3. 这样 Java 中的 int add(int a, int b) 方法的实现 就转化成:在 C++中对 Java_TestJNI_add 的定义


三 .  创建 C++ 项目 CppWrap


1. 使用 Visual Studio 2017 建立一个 Visual C++ の空项目 CppWrap 。


2. 把步骤二中 javah 生成的 TestJNI.h 放在头文件目录下,这个 TestJNI.h 相当于 C++ 与 Java 的衔接点。


3. 新建源文件 TestJNI.cpp 放在源文件目录下 , 这个 TestJNI.cpp 相当于 C++ 与 C# 的衔接点。

顺便说一下 JNI 原理的调用关系是:JAVA -> C++ dll -> Managed C++ -> C# dll , 这里面 Managed C++ 已经被集成到 Visual Studio 里面了,这种集成机制在 Visaul Studio 里面被称为 公共语言运行库支持(CLR), 需要在项目的属性页进行配置打开


4. "生成" -- "配置管理器",  "配置" 选 "Release", "平台" 选 "x64" 

这里默认你是 64 位 Windows 平台


5.  "项目" -- "CppWrap属性" -- "配置属性" -- "VC++目录" 

将 jni.h 和 jni_md.h 所在的目录添置在属性页面中的 VC++ 的 "包含目录" 中,以消除项目提示的几个 error ,这两个文件在 jdk 安装目录下的 include 子目录中,通常分别在 C:\Program Files\Java\jdk1.8.0_121\include 和 C:\Program Files\Java\jdk1.8.0_121\include\win32 中。


6. "项目" -- "CppWrap属性" -- "配置属性" -- "常规"

将 "配置类型" 改为 "动态库(.dll)", 

将 "公共语言运行时支持" 改为 "公共语言运行时支持(/clr)"


7. 将步骤一中生成的 CSharpDll.dll 和 CSharpDll.pdb 拷贝到当前项目目录中,可以和 TestJNI.cpp 同目录,在 Visual Studio 2017 中通过 "添加现有项" 方式将 CSharpDll.dll 和 CSharpDll.pdb 添加到工程中。


8. 对 TestJNI.cpp 添加代码如下:

#include "TestJNI.h"#using "CSharpDll.dll"using namespace CSharpDll;/** Class:     TestJNI* Method:    add* Signature: (II)I*/JNIEXPORT jint JNICALL Java_TestJNI_add(JNIEnv * jenv, jobject jobj, jint i1, jint i2){Calculate ^cal = gcnew Calculate();return cal->add(i1, i2);}


9.  进行项目生成,工程目录的 x64 / Release 生成得到了一些文件, CppWrap.dll 和 CppWrap.pdb 等


10. 将 CppWrap.dll 和 CSharpDll.dll 一起拷贝到 jdk 安装目录下的 bin子目录中



四 . 运行 Java 项目 TestJNI 

输出:

In C# , add method has been called.

41



五 . 一些错误及解决 
错误:Can't load IA 32-bit .dll on a AMD 64-bit platform
解决:http://blog.csdn.net/l1028386804/article/details/46605003