博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA程序通过JNI调用C/C++库
阅读量:5068 次
发布时间:2019-06-12

本文共 1933 字,大约阅读时间需要 6 分钟。

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 
#include
/* /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 
/* Header for class JNIDemo */#ifndef _Included_JNIDemo#define _Included_JNIDemo#ifdef __cplusplusextern "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

你可能感兴趣的文章
Spring之依赖注入
查看>>
web服务交互中HTTP数据内容GZIP,ZLIB格式压缩与解压缩封装(共享)
查看>>
改变窗体大小视图区图形也会跟着变化 MFC
查看>>
cocos3——8.实现初学者指南
查看>>
基于Lucene3.5.0怎样从TokenStream获得Token
查看>>
一网打尽各类Java基本数据类型转换
查看>>
FlowLayout布局
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>
vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
查看>>
docker on spark
查看>>
国内如何使用gem?
查看>>
处理HTML标签方法
查看>>
葡萄城报表介绍:报表工具
查看>>
Fxx and game
查看>>
WebSocket 是什么原理?为什么可以实现持久连接
查看>>
viewport移动端适配,读文笔记
查看>>
hdu 2426(KM)
查看>>
浅谈Trie树(字典树)
查看>>
批处理 windows 服务的安装与卸载
查看>>
stdcall, cdecl, pascal 区别(转载)
查看>>