基于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快速入门之 ...
随机推荐
- Python 面向对象-------补充
Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...
- ASP.NET MVC 中的IResolver<T> 接口
在ASP.NET MVC 的源码一些实体对象(比如 ControllerBuilder,ControllerFactory, Filters, ViewEngines 等)不再直接通过关键字new来创 ...
- 反汇编工具 objdump的使用简介
arm-linux-objdump -D led.elf > led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到反汇编代码 ...
- python练习题100例
链接地址:http://www.runoob.com/python/python-100-examples.html
- 激活函数之ReLU/softplus介绍及C++实现
softplus函数(softplus function):ζ(x)=ln(1+exp(x)). softplus函数可以用来产生正态分布的β和σ参数,因为它的范围是(0,∞).当处理包含sigmoi ...
- MySQL auto_increment介绍 以及 查询和修改auto_increment的方法
一.auto_increment使用方法 .创建table时设置auto_increment属性和初始值100 create table nonove ( id bigint unsigned not ...
- Switch能否使用String做参数
在Java语言中Swith可以使用参数类型有:Only convertible int values, strings or enum variables are permitted 可以自动转换为整 ...
- 转载 eclipse中的include设置
备注:在10.1版的niosii使用的eclipse中设置的方法是右键->properties->c/c++general->path and symbols->include ...
- 转载关于Qsys的 指令总线 和 数据总线
1.关于Qsys的 指令总线 和 数据总线 连接的问题(data_master和instruction_master) 关于数据和指令端口的连接的疑问,这是初用Qsys的童鞋们很困惑的问题,之前使 ...
- 类数组对象:arguments
在js中调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的东西里面,那它到底是什么呢? 一.描述 arguments 是一个对应于传 ...