JNI技术实现--Java调C/C++
废话不多说,首先我们来看Java调用C/C++步骤:
1.编写Java代码,在代码中使用native关键字标明该方法是调用本地库,不需要实现。
2.使用javah -jni 命令,生成对应的头文件,此步骤主要是规范化本地代码,总所周知,Java是平台无关的,但是C/C++是平台相关的,所以需要规范本地代码,使其表示的值与Java中的值意义相同。
3.用C/C++实现头文件中的接口函数,并把其编译链接成动态链接库,在环境变量设置动态库路径。
4.在Java代码中添加加载动态链接库的代码,并将其编译为class文件。
5.运行并测试效果。
example:
1、java代码:Hello.java
public class Hello {
static {
System.loadLibrary("hello");
}
public native static void hello(String s); //声明本地库函数
public static void main(String[] args) {
hello("hello");
for(String s : args) hello(s);
}
}
2、使用 javah -jni Hello 命令生成 Hello.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */ #ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: hello
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_Hello_hello
(JNIEnv *, jclass, jstring); #ifdef __cplusplus
}
#endif
#endif
3、实现头文件 Hello.h 中的函数 JNIEXPORT void JNICALL Java_Hello_hello(JNIEnv *, jclass, jstring);
新建cpp文件 Hello.cpp 内容如下:
#include <jni.h>
#include"Hello.h"
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL Java_Hello_hello (JNIEnv* env, jclass jc, jstring s)
{
const char* str = env->GetStringUTFChars(s, );
cout << str << endl;
env->ReleaseStringUTFChars(s, str);
}
将 Hello.cpp 编译成动态库 libhello.so:g++ -fPIC -shared -IXXX_jni -IXXX_jni_md Hello.cpp -o libhello.so 其中 XXX_jni 为jni.h的路径, XXX_jni_md 为 jni_md.h 的路径
4、编译 Hello.java : javac Hello.java 生成 Hello.class 最好还要添加 libhello.so 路径到环境变量才能运行。
5、运行结果:

JNI技术实现--Java调C/C++的更多相关文章
- Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...
- JNI测试-java调用c算法并返回java调用处-1到20阶乘的和
一,java端: 定义native方法, 'public native long factorial(int n);', 该方法用c/c++实现,计算'1到20阶乘的和',参数中'int n'是前n项 ...
- Java如何调用C语言程序,JNI技术
Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...
- Java调优
Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题 ...
- Java Native Interfce三在JNI中使用Java类的普通方法与变量
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...
- JNI技术概念小结
JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? |- 首先,Java语言 ...
- JNI技术基础(2)——从零开始编写JNI代码
书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...
- JNI技术基础(1)——从零开始编写JNI代码
众所周知,Java程序的最大特点就是其跨平台的特性,编写的上层应用程序可以不加任何修改甚至不用重新编译而运行于不同的平台上,然而,Java本身也存着这一个弊端,那就是性能上相对要差一些,在对性能要求比 ...
- [Android Webkit]JNI基础及Java层与C++层的交互
1. JNI 注册 1.1. JNI的基础结构 JAVA == JNI == Native Code JNI(Java Native Interface)是Java与Native ...
随机推荐
- SUSE CaaS Platform 4 - 使用 Ceph RBD 作为持久存储 (静态)
1.所有节点安装 # zypper -n in ceph-common 复制 ceph.conf 到 worker 节点上 # scp admin:/etc/ceph/ceph.conf /etc/c ...
- 为什么要学习go语言
终于等到你!Go语言--让你用写Python代码的开发效率编写C语言代码. 为什么互联网世界需要Go语言 世界上已经有太多太多的编程语言了,为什么又出来一个Go语言? 硬件限制:摩尔定律已然失效 摩尔 ...
- elasticsearch http 搜索 测试
1.查询所有的documents http://192.168.43.45:9200/_search boost parameter 细粒度搜索条件权重控制 如:组装多个查询条件,其中一个匹配的想要优 ...
- MySQL 数据库删除表中重复数据
采集数据的时候,由于先期对页面结构的分析不完善,导致采漏了一部分数据.完善代码之后重新运行 Scrapy,又采集了一些重复的数据,搜了下删除重复数据的方法. N.B. 删除数据表的重复数据时,请先备份 ...
- sprigboot项目中配置xml格式的logback
slf4j依赖和logback的依赖 idea中springboot项目的resources目录下新建logback-spring.xml文件,内容大致如下: <?xml version=&qu ...
- StringBuffer的一些小整理
大家好,欢迎大家在百忙当中来到我的博客文,也许是因为各种需要到此一游,哈哈.不过来到这里不会让您失望的,此段博文是这段时间不忙的时候整理出来的,对于刚学java基础的同学非常适合.下面言归正传: 首先 ...
- [UWP]使用CompositionLinearGradientBrush实现渐变画笔并制作动画
1. 什么是 CompositionBrush CompositionBrush(合成画笔)是操作可视化层时用于绘制 SpriteVisual 区域的画笔. 使UWP 应用时可以选择使用 XAML 画 ...
- 02 【PMP】项目管理系统、PMIS、工作授权系统、配置管理系统、变更管理
PMBOK融会贯通:盘点八大系统<项目管理系统.PMIS.工作授权系统.配置管理系统.变更管理> 一. PMBOK相关系统: 工作系统作为事业环境因素,提高或限制项目管理的灵活性,并 ...
- Cocos2d-x 学习笔记(3.1) Scene 场景与场景切换
1. Scene 简介 游戏中我们看到/看不到的所有元素都是展示在场景之Scene上. 我们可以把场景比作放在地上的没盖纸箱,层Layer是纸箱里堆放的玻璃,Sprite等元素画在玻璃Layer上,这 ...
- Cocos2d-x 学习笔记(11.3) JumpBy JumpTo
1. JumpBy JumpTo JumpBy,边跳边平移,不只做垂直向上的抛物动作,同时还在向终点平移.JumpTo是JumpBy的子类. 1.1 成员变量 create方法 JumpBy: Vec ...