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; } }}
二 . 创建 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 的衔接点。
顺便说一下 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
- C#调用java webservice
- C#调用java代码
- java 调用c#
- C#调用java代码
- Java调用C# dll
- Java 调用 C# DLL
- C#调用java代码
- java调用c# dll
- C#调用java webservice
- Unity C#调用java
- C#调用java程序
- java 调用 C# webapi
- Java 调用 C#
- Java WS和C#调用
- Java JNI 调用C#方法
- Java调用C#版WebService
- java调用C#动态库
- java调用C#的dll
- POJ
- 用List构建带有层次结构的json数据
- Html5第十课时,年龄成绩判断
- 如此让人放弃的面向对象三大特征——看完就搞定
- 51nod--1088 最长回文子串(连续!)
- Java 调用 C#
- 卸载opencv-2.4.10
- poj-2142-
- 链表翻转。给出一个链表和一个数K,按照分组逆置。
- hash 模板
- 栈+队列+优先队列-总结
- 《UNIX网络编程》多线程TCP C/S服务器正常启动和正常结束过程剖析
- Showing a Dialog Fullscreen or as an Embedded Fragment
- 数据库——(8)连接查询