您的位置 首页 java

Java与C&C++交互技术-JNI

一、 jni 介绍

JNI是 java Native Interface的缩写,它是Java平台的一个特性(并不是Android系统特有的)。其实主要是定义了一些JNI函数,让开发者可以通过调用这些函数实现 Java 代码调用C/C++的代码,C/C++的代码也可以调用Java的代码,这样就可以发挥各个语言的特点了。一般情况下我们首先是将写好的C/C++代码编译成对应平台的动态库(windows一般是dll文件,linux一般是so文件等)。

JNI可以这样与本地程序进行交互:

1、你可以使用JNI来实现“本地方法”(native methods),并在JAVA程序中调用它们。

2、JNI支持一个“调用接口”(invocation interface),它允许你把一个 JVM 嵌入到本地程序中。本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写的软件模块。

二、实例(Java和C++为例)

1、首先在java中定义native方法:

hello和add方法用来简单演示jni技术,callback用来演示在C++中回调java方法。

2、使用javah命令生成native方法的 头文件

javah com.cgfpg.jni.JniNativeCode

生成头文件

3、新建c++工程,使用Visual Studio创建项目

创建项目

选择dll和空项目

将JNI生成的头文件引入进来:

引入头文件

将jdk中的jni.h和jni_md.h这2个头文件引入C++项目,这2个头文件是编译生成dll所必须的。

实现头文件,新建一个cpp 源文件

然后编译生成dll,将dll拷贝到工程根目录下,或者加dll所在的文件路径加入到系统path路径下。

运用java程序调用dll结果如下:

三、使用注意实现

1、dll版本要和java程序版本一致,都是32位或都是64位。

2、jni关于java方法的签名:

观察下面四个方法对应的签名

public void test(){} ()V

public void test1(int i){} (I)V

public int test2(){ return 1;} ()I

public int test3(int i) { return i;} (I)I

由此可以看出:签名是由两部分组成,"()" 里面代表的是方法的参数,后面外面的部分代表的是该方法的返回值

关于这两部分的定义其实又有分 基本数据类型 和 引用数据类型

基本数据类型对应关系如表:

引用数据类型: 比较麻烦点,以“L”开头,以“;”结束,中间对应的是该类型的路径

如:String : Ljava/lang/String;

Object: Ljava/lang/Object;

自定义类 Cat 对应 package com.duicky;

Cat : Lcom/duicky/Cat;

数组表示: 数组表示的时候以“[” 为标志,一个“[”表示一维数组

如:int [] :[I

Long[][] : [[J

Object[][][] : [[[Ljava/lang/Object;

JNI的使用方法还有很多种,这里只是例举了部分。有兴趣的小伙伴,可以上网查询资料学习下,欢迎相互交流学习。

文章来源:智云一二三科技

文章标题:Java与C&C++交互技术-JNI

文章地址:https://www.zhihuclub.com/191095.shtml

关于作者: 智云科技

热门文章

网站地图