JAVA程序通过JNI调用C/C++库
java程序如何调用c/c++库中的函数主要分为三个步骤:
1. 加载库文件. System.loadLibrary
2. 找到函数( java函数<----映射---->c函数 )
3. 调用函数
在映射中一般分为显式建立和隐式建立。
显式建立:
下面举个例子:
/*filename native.ccommod: gcc -shared -o libnative.so native.c -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include -fPIC */ #include <stdio.h> #include <jni.h> /* /usr/lib/jvm/java-1.7.0-openjdk-amd64/include */int c_hello( JNIEnv *env, jobject cls, jint num ) {printf("hello c/c++ num=%d\r\n",num);return num*2; }/* 2. java <--> C */static const JNINativeMethod methods[] = {{"hello","(I)I",(void *)c_hello}, /* java function 参数 c function*/ };JNIEXPORT jint JNICALLJNI_OnLoad( JavaVM *jvm, void *reserved ) {JNIEnv *env;jclass cls;/* 获取运行环境 */if((*jvm)->GetEnv(jvm,(void **)&env,JNI_VERSION_1_4))return JNI_ERR;/* 获取java中的类 */cls = (*env)->FindClass(env,"JNIDemo");if(cls==NULL)return JNI_ERR;/* 函数映射 */if((*env)->RegisterNatives(env, cls, methods,1)<0)return JNI_ERR;return JNI_VERSION_1_4; }
java代码:
/* * filename JNIDemo.java * commod: javac JNIDemo.java * */ public class JNIDemo {static {/* 1. load */System.loadLibrary("native"); /*libnative.so*/}public native static int hello( int num );public static void main( String args[] ){/* 2. java <--> C *//* 3. call */System.out.println( hello(123) );} }
jni中字段描述符:
也可以通过java来生成头文件从而获取描述符。
先编译java程序 javac JNIDemo.java
javah -jni JNIDemo
将会生成 JNIDemo.h:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JNIDemo */#ifndef _Included_JNIDemo #define _Included_JNIDemo #ifdef __cplusplus extern "C" { #endif /** Class: JNIDemo* Method: hello* Signature: (I)I*/ JNIEXPORT void JNICALL Java_JNIDemo_hello(JNIEnv *, jclass);#ifdef __cplusplus } #endif #endif
转载于:https://www.cnblogs.com/ynxf/p/6897462.html
JAVA程序通过JNI调用C/C++库相关推荐
- Java中使用JNI调用本地动态库的方法
在Java中,要使用动态库,就要使用到 JNI.首先来看看百度百科对JNI的描述:从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java ...
- Java如何利用JNI调用C++(简略介绍及步骤)
Java如何利用JNI调用C++(简略介绍及步骤) 文章目录 Java如何利用JNI调用C++(简略介绍及步骤) 一.原理介绍 二.详细步骤 步骤一:编写Java类 步骤二:生成.h文件 步骤三:CL ...
- arch linux arm下载_linux系统下编译给android JNI调用的Gmssl库
编译给android JNI调用的Gmssl库的方法,网络上并不多.按照叶大强(CSDN账号:hkNaruto)写的<GmSSL Android NDK编译 (版本95c0dba>的帖子编 ...
- java主程序怎样调用子程序_存过和函数以及在Java程序中的调用
存储过程,函数都是数据库的对象. 创建和调用 存储在数据库中的子程序,是由plsql语言写的,完成特定功能的程序. 函数可以返回值,存过不能返回值.除此之外,一致. create procedure ...
- 车辆入库java程序_java扫描入库及出库,基于谷歌类开发.仅提供完整代码 连接SQL使用,...
java扫描入库及出库,基于谷歌类开发.仅提供完整代码 连接SQL使用,需要自行制作中心服务器,中心服务器代码在本人另一实例里面,请自行下载 [实例简介] 扫描入库及出库,基于谷歌类开发.仅提供完整代 ...
- java程序设计项目案例化教程题库及答案
章节自测 1.第01章:走进Java的世界 1.1.填空题 1. Java源程序文件的后缀是*.java,Java字节码文件的后缀名称是*.class. 2. Java程序实现可移值性,依靠的是JVM ...
- Windows系统下通过JNI调用dll动态库的实现
目的:java代码使用jni获取数据 工具: eclipse + Microsoft visual studio (c++) 业务代码: Java代码业务实现: package com.weip.jn ...
- windows7下,Java中利用JNI调用c++生成的动态库的使用步骤
1.从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-wi ...
- Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤
1. 打开新立得包管理器,搜索JDK,选择openjdk-6-jdk安装: 2. 打开Ubuntu软件中心,搜索Eclipse,选择Eclipse集成开发环境,安装: 3. 打开Eclipse, ...
最新文章
- linux漏洞知乎_安装 Manjaro Linux 后必做的 6 件事 | Linux 中国
- 亚马逊AWS-EC2云服务器部署代理服务
- 搜索引擎索引之索引基础
- css两列布局之基于BFC规则实现
- Vue之splice和push
- Linux(CentOS)安装apache(httpd),其他电脑无法访问的原因 【iptables打开某端口】
- 讯飞输入法更新10.0版本 上线全新A.I.语音输入引擎
- Scott Mitchell 的ASP.NET 2.0数据教程之十七:: 研究插入、更新和删除的关联事件
- 图纸怎么发给别人_微信语音怎么转发?微信语音转发给别人最新办法10秒解决...
- matlab三维绘图函数plot3【matlab图行绘制四】
- matlab拟合反比例函数,y与x的函数关系式图像 已知变量y与x之间的函数
- select去重 sqlserver_SQLSERVER 去重
- 飞思卡尔mc9s08烧录方法_飞思卡尔8位单片机MC9S08教程
- 计算机一级mcoffice考试题型,计算机一级MSOffice考试试题
- Android 房租计算器,简单计算器
- [latex] 页码起始页设置
- js 免费可靠cdn地址(富文本编辑器tinymce的实践)
- Mysql中大于、大于等于、小于、小于等于的写法
- 浏览器兼容性问题总结
- SFD:今年怎么了?
热门文章
- 守卫者的挑战(guard)
- jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第二话):安装插件,配置JDK、Git、Ant...
- php 连接oracle插入多张图片的方法
- JavaSE----基础语法(方法)
- 7个鲜为人知却超实用的PHP函数
- objective-c 类目(Category)和延展(Extension)
- win7乱码 字符集解决方案
- 网站建设——从无到有
- Maven-Dependency Mechanism
- cnetos6,centos7添加新网卡,系统不识别的解决办法