java程序如何调用c/c++库中的函数主要分为三个步骤:

  1. 加载库文件. System.loadLibrary

  2. 找到函数( java函数<----映射---->c函数 )

  3. 调用函数

在映射中一般分为显式建立和隐式建立。

显式建立:

下面举个例子:

/*
filename native.c
commod: 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 JNICALL JNI_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

JAVA程序通过JNI调用C/C++库的更多相关文章

  1. java使用JNA框架调用dll动态库

    这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative.其中JNA调用DLL是最方便的. ·JNI ·JNA ·JNative java使用 JNI来调用dll动态 ...

  2. JNI调用so动态库

    1.编写native接口 package org.demo; public class JniDemo { public static native int bmp2fea(byte[] bmp, b ...

  3. java native interface JNI 调用Java方法

    在上一篇文章中介绍了JNI.以及java调用JNI.这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你能够创建Java对象,get.set 静态(static)和 实例(instanc ...

  4. Java採用JNI调用VC++生成的dll(Java与C++交互)

    应项目需求,须要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组须要和C++和Android进行交互.以下是java和C++採用JNI的方式进行 ...

  5. 1.JAVA中使用JNI调用C++代码学习笔记

    Java 之JNI编程1.什么是JNI? JNI:(Java Natibe Inetrface)缩写. 2.为什么要学习JNI?  Java 是跨平台的语言,但是在有些时候仍然是有需要调用本地代码 ( ...

  6. JNI调用Cython生成库‘undefined symbol: PyInit_’问题

    最近项目需要提升所有 Python 算法的执行时间,并给 Java 框架调用,根据 Python一键转Jar包,Java调用Python新姿势!的思路可以用 Cython 将 Python 代码转换为 ...

  7. 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案

    方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...

  8. 如何在java程序中调用linux命令或者shell脚本

    转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...

  9. Android Jni 调用

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...

随机推荐

  1. Android多触点总结

    文章部分内容参考: http://blog.csdn.net/barryhappy/article/details/7392326 总结: 1. event.getX()可以得到x的坐标,里面的参数0 ...

  2. vue绑定用户页面

    1.vue微博回调空页面 微博回调空页面为: http://127.0.0.1:8888/oauth/callback/ 1.1 页面路径 components\oauth.vue <templ ...

  3. PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法

    对于Model/View中视图的数据编辑后怎么能实时获取编辑的数据变动位置和变动情况查阅了一些资料,终于基本弄明白必须重写Model的setData方法才能截获.setData方法是视图中各种角色数据 ...

  4. PyQt(Python+Qt)学习随笔:Qt Designer中部件的mouseTracking和tabletTracking属性

    在Qt Designer中的部件属性设置中,有mouseTracking和tabletTracking两个属性,这两个属性是跟踪鼠标或平板触控笔的移动轨迹的. 一.mouseTracking mous ...

  5. Flask flask-migrate 数据库迁移

    简介 flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的. 官方文档:http://flask-migrate.readthedocs.io/en/latest/ 使用: ...

  6. golang GMP goroutine调度器

    Goroutine可以动态的伸缩栈的大小,最小2-4kb,最大1GB

  7. buucitf-[极客大挑战 2020]Roamphp1-Welcome

    打开靶机,发现什么也没有,因为极客大挑战有hint.txt,里面说尝试换一种请求的方式,bp抓包,然后发送了POST请求,出现了下面的界面 这个还是挺简单的,因为是极客大挑战上的第一波题,关键是这个如 ...

  8. java视频格式转换

    项目中需要对各种视频格式转码为mp4格式,试了好多办法,最后使用ffmpeg 工具完美转码,ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) 链接 ...

  9. I am zhoukangyang!

    我是 \(\texttt{zhoukangyang}\),一名来自浙江省,杭州市的初二菜鸡 \(\texttt{oier}\) . 洛谷zhoukangyang 很多东西因为太垃圾所以 了,要开 请洛 ...

  10. 题解-CF708D Incorrect Flow

    题面 CF708D Incorrect Flow 给一张网络流图,可能有流量不守恒或者流量超过容量的情况,求最少的将某条边流量或容量 \(\pm 1\) 的操作次数使得网络流图正确. 数据范围:\(1 ...