基于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快速入门之 ...
随机推荐
- CC 攻击检测研究现状
网络层ddos 是让去往银行的道路交通变得拥堵,无法使正真要去银行的人到达:常利用协议为网络层的,如tcp(利用三次握手的响应等待及电脑tcp 连接数限制)等应用层ddos 则是在到达银行后通过增办. ...
- python基础之函数名称空间与作用域
- 记录个人数组、字符串自己常忘记的方法,以及ES常用处理方式
记录自己在工作中,时不时使用,每次都要去查一下的基础方法.以及ES6经常使用的方法 一.Array 1.concat 合并数组 2.shift 获取数组第一个元素 unshift 向数组首位添加一个元 ...
- JAVA线程死锁
文件名:DeadThreadByExtend.java 注: 1.起线程的时候用的是start方法,run方法也可以调用,但是仅仅相当于普通调用,在当前线程内执行. 2.synchronized 不能 ...
- vue动态 设置类名
<div class="tab"> <navigator :class="currentTab=='mzfw'?'nav active': 'nav'& ...
- 剑指Offer面试题:7.斐波那契数列
一 题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二 效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 基于epoll的TP传输层实现
1. 抽象TP传输层设计 在使用epoll实现实际的传输层之前,先设计一个抽象的传输层,这个抽象的传输层是传输层实现的接口层. 接口层中一共有以下几个通用的类或者接口: (1)Socket:通用的套接 ...
- 初识ADO.NET
摘要 作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角色.本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET的主要组成部分 ...
- 【WCF安全】WCF 自定义授权[用户名+密码+x509证书]
1.x509证书制作(略) 2.直接贴代码 ----------------------------------------------------------------------服务端----- ...
- centos6.5 安装nginx
安装之前先安装VMware tools(方便于从windows上拷贝文件到linux) 1. nginx安装环境 nginx是C语言开发,建议在linux上运行,本次使用Centos6.5作为安装环境 ...