基于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快速入门之 ...
随机推荐
- 命令行创建db2数据库
在cmd界面执行db2cmd命令 然后在db2cmd界面执行db2命令 然后执行 CREATE DATABASE UIBS命令 创建完成之后可以使用CONNECT TO UIBS命令连接数据库
- 修改element内部样式的两种方式
第一种: 全局样式修改: 但这种方式有点不好的地方,这样会影响别的组件,比如修改elementUI的树结构的样式,这样改的话会影响到别的树组件: 第二种方式: 在要修改的组件内修改树结构样式 比如改这 ...
- ARM汇编指令集1
(汇编)指令是CPU机器指令的助记符,经过编译过会得到一串0011组成的机器码,可以由CPU读取执行. (汇编)伪指令本质不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译 ...
- [Hive]HiveServer2配置
HiveServer2(HS2)是一个服务器接口,能使远程客户端执行Hive查询,并且可以检索结果.HiveServer2是HiveServer1的改进版,HiveServer1已经被废弃.HiveS ...
- PhotoShop脚本指南
Photoshop脚本语言 Photoshop支持三种脚本语言:AppleScript,VBScript,JavaScript.其中AppleScript为苹果系统,VBScript为Windows操 ...
- 在CodeBlocks上配置OpenGL问题
问题:出现No such file or directory.之后重建了C++project 仍然出现这个error.嘿 奇了怪了! 原因:前几日写密码学作业,用到NTL库,将编译器路径设置为NTL库 ...
- CALayer 实现的动画效果(一)
先看下效果图: (备注: 上面GIF 是Mac 下录制视频的并转化成gif 的而成,工具为GIF Brewery 3 [这款软件挺不错的]) 那么主题来了如何实现上面效果呢? 1.创建自定义CALay ...
- 【spring源码学习】spring的远程调用实现源码分析
[一]spring的远程调用提供的基础类 (1)org.springframework.remoting.support.RemotingSupport ===>spring提供实现的远程调用客 ...
- Django的CSRF机制
原文链接:http://www.cnblogs.com/lins05/archive/2012/12/02/2797996.html 必须有的是: 1.每次初始化一个项目时,都能看到django.mi ...
- Ubantu 新建用户后没有生成对应文件夹
原命令:useradd python 改正后:useradd python -m 后成功在home目录下创建文件夹 原因: man useradd就可以看到如此介绍:Create the user´s ...