基于JNI,JAVA 调用 C++入门
1.步骤一览
2.步骤详情
2.1. 编写Java类 native
package com.ibugs.jni; /**
*
* @author i_bugs
*
*/
public class CProcessor { // 声明native方法
public native boolean checkValid();
public native String processData(String str);
}
2.2.编译Class
首先编译CProcessor类,得到CProcessor.class
2.3.生成头文件
然后生成对应头文件com_ibugs_jni_CProcessor.h, 在cmd窗口下,命令:javah com.ibugs.jni.CProcessor
以下是头文件中的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ibugs_jni_CProcessor */ #ifndef _Included_com_ibugs_jni_CProcessor
#define _Included_com_ibugs_jni_CProcessor
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ibugs_jni_CProcessor
* Method: checkValid
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_com_ibugs_jni_CProcessor_checkValid
(JNIEnv *, jobject); /*
* Class: com_ibugs_jni_CProcessor
* Method: processData
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ibugs_jni_CProcessor_processData
(JNIEnv *, jobject, jstring); #ifdef __cplusplus
}
#endif
#endif
其中,Java_com_ibugs_jni_CProcessor_checkValid (JNIEnv *, jobject),Java_com_ibugs_jni_CProcessor_processData (JNIEnv *, jobject, jstring)这两个方法需要我们用C++来实现
2.4.C++实现本地方法
这里借助Visual Studio2012,新建项目
在Application Settings设置Appliction Type中,请选择DLL, Addition options 选择Empty project选项如下
Source Files目录新建CProcessor.cpp文件,用来实现Java要调用的方法
#include "com_ibugs_jni_CProcessor.h" JNIEXPORT jboolean JNICALL Java_com_ibugs_jni_CProcessor_checkValid
(JNIEnv *, jobject){
return true;
} JNIEXPORT jstring JNICALL Java_com_ibugs_jni_CProcessor_processData
(JNIEnv *, jobject, jstring str){
return str;
}
其中第一行则为生成的头文件,同时还需要jni.h及jni_md.h,这两个文件可以在tomcat的安装目录下找到,分别在JAVA_HOME/include及JAVA_HOME/include/win32下,将这些文件引入到项目中
2.5.编译动态链库
设置编译的机器位数32位或者64位,右击项目Property进入Configuration Manager窗口这里可以调整编辑Dll的位数不再赘述
然后build工程即可。则在项目工程目录中找到CProcessor.dll文件
2.6.加载调用动态链库
package com.ibugs.jni; public class TestCProcessor { // 加载动态链库
static {
System.loadLibrary("CProcessor");
} public static void main(final String[] args) { CProcessor cProcessor = new CProcessor(); System.out.println("checkValid()result:" + cProcessor.checkValid());
System.out.println("processData()result:"
+ cProcessor.processData("hello"));
}
}
注意:要将CProcessor.dll放入java.library.path,我这里将动态链库直接放到Windows/System32下面,否则无法加载。在loadLibrary时,不需要写明后缀.dll
3.小结
在用JNI调用C++过程中主要就是生成native方法对应的头文件,然后用C/C++实现头文件中的方法,编译成DLL动态链库就可以调用了。
基于JNI,JAVA 调用 C++入门的更多相关文章
- cocos2d 中使用jni Java 调用 C++ 方法
1.首先是LoadLibrary cocos2d中的C++代码会编译成一个.so文件.放在安卓文件夹下的libs/armeabi 下,然后java会load进来,这步我们不用做了,由于cocos2d已 ...
- [JNI] Java 调用 C++ dll
首先介绍一下JNI吧! JNI 是Java提供的一个用于调用本地接口的接口层,位于Java代码 和 本地代码之间的一层:主要功能是 数据类型的转换,还有就是通过这一层来调用本地代码! 下面就说说Jav ...
- JNI Java调用C代码 示例
Activity public class MainActivity extends ListActivity { static { System.loadLibrary(&q ...
- JNI——Java调用C/C++函数
从C/C++到Java,再从Java回到C/C++,今天终于有机会了解了连接Java.C/C++的桥梁——JNI.哈哈!分享一下! 一.简介 JNI是Java native interface的简 ...
- JNI——JAVA调用C
1. 编译java:javac JNIDemo.java 2. 编译JNI:gcc -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/ -I/usr/li ...
- ubuntu下使用JNI Java调用C++的例子
TestJNI.java public class TestJNI { static{ System.load("/home/buyizhiyou/workspace/JNI/src/lib ...
- 基于 Android NDK 的学习之旅-----Java 调用C
随便谈谈为什么要Java调用C 吧: 我认为: 1. 有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所以我们没必要同样的功能又在java中实现一遍.例如我之前做的一个项目 ...
- cocos2d 中使用jni C++ 调用 Java 方法
1.简单数据类型样例 如果我们Java中有这么一个open的静态方法,它没有參数,有一个int的返回值.怎么在C++中调用它呢? package cb.CbCCBLE; public class Cb ...
- JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...
随机推荐
- Ceph Monitor的数据管理
转自:https://www.ustack.com/blog/ceph-monitor-2/ Monitor管理了Ceph的状态信息,维护着Ceph中各个成员的关系,这些信息都是存放在leveldb中 ...
- docker-web管理工具实验
工具名称 共有功能 备注 UCP 官方.收费 portainer 镜像库 容器管理 rancher shipyard kubernetes (上诉部署都基于linux) UCP ...
- vs中: 错误,未定义的标识符getline 的解决方法
这种情况一般都是,在使用的时候没有include<string>而导致的,加上就可以正确编译通过
- java事务(三)——自己实现分布式事务
在上一篇<java事务(二)——本地事务>中已经提到了事务的类型,并对本地事务做了说明.而分布式事务是跨越多个数据源来对数据来进行访问和更新,在JAVA中是使用JTA(Java Trans ...
- 单链表删除(Delete)或者去除(Remove)节点面试题总结
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76061004冷血之心的博客) 关于单链表反转的多种形式请参见本博文 ...
- Leetcode 986. Interval List Intersections
暴搜.. class Solution(object): def intervalIntersection(self, A: List[Interval], B: List[Interval]) -& ...
- 完全卸载session 所需要的函数
session_unset() 删除内存当中的session数据:必须放在session_destroy的前边.因为应用session_destory后session_id();就会消失. 删除se ...
- rabbitmq java
package com.enniu.rabbitmq; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.AMQP.BasicPr ...
- gulp 集成其他基于流的工具
1. 流.缓冲.vinyl 文件对象 gulp 的流是虚拟文件对象 包含的属性有 base 文件名 path 文件路径 content 缓冲.nodejs 流 2. gulp 集成 browserif ...
- Visual Studio Code如何调试代码
首先安装扩展调试插件debugger for chrome 点击瓢虫按钮,进行调试项目的配置,点击配置按钮 选择Chrome环境, 会弹出Chrome调试配置文件launch.json,修改下端口即可 ...