问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎样用 jni来交互java与 c/c++

发布网友 发布时间:2022-05-29 21:32

我来回答

1个回答

热心网友 时间:2024-10-01 17:11

 JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。很多时候,某些功能用Java无法实现,比如说涉及到底层驱动的一些功能,这时候我们就可以利用JNI来调用C或者C++程序来实现,这就是JNI的强大之处。但是JNI也有它的缺点,使用java与本地已编译的代码交互,通常会丧失平台可移植性。
  下面是一个JNI例子,调用C++输出"hello world":

第一步:创建Java类,在里面定义一个本地方法(用native关键字修饰的方法)
  public native void sayHello();
第二步:使用javah命令(javah 类的全路径)生成本地方法的C++头文件
  在DOS窗口中进入工程所在目录,然后执行javah com.test.TestNative命令,执行完之后就会在当前目录生成一个后缀名为.h的头文件,如com_test_TestNative.h,这个头文件是根据包名和类名来命名的。

1 /* DO NOT EDIT THIS FILE - it is machine generated */
2 #include <jni.h>
3 /* Header for class com_test_TestNative */
4
5 #ifndef _Included_com_test_TestNative
6 #define _Included_com_test_TestNative
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 /*
11 * Class: com_test_TestNative
12 * Method: sayHello
13 * Signature: ()V
14 */
15 JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello
16 (JNIEnv *, jobject);
17
18 #ifdef __cplusplus
19 }
20 #endif
21 #endif

  15、16行是对TestNative类中的本地方法sayHello()的声明。这个h文件相当于我们在java里面的接口,这里声明了一个 Java_com_test_TestNative_sayHello (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致。
第三步:编写C/C++本地代码,生成动态链接库文件
  首先在VC6.0(当然也可以用其他工具)中创建一个dll工程---Win32 Dynamic-Link Library工程。然后将上面生成的头文件com_test_TestNative.h添加到该工程中,然后创建一个源文件引用该头文件并且实现头文件中本地函数的功能:

1 #include<iostream.h>
2 #include"com_test_TestNative.h"
3
4 JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello(JNIEnv *env, jobject obj)
5 {
6 cout<<"hello world!"<<endl;
7 }

  这里因为com_test_TestNative.h中引入了jni.h所以要将jni.h加入到VC6.0安装目录下的Include目录中。jni.h在JDK安装目录下的include中,同时得件include/win32中的两个头文件jawt_md.h、jni_md.h也导入到VC6.0中。
  将所依赖的头文件导入之后,我们就可以构建该工程了,按F7就行了,完了会在工程目录中的Degug目录下生成一个动态链接库文件,我这里生成的是NativeCode.dll。我们就可以将该dll文件拷贝到环境变量path所包含的目录下给咱们的Java程序调用了,为了方便,我们也可以将dll所在的工程目录加入到环境变量path中去,这样可以避免每次都要拷贝的麻烦。注意修改环境变量之后要重启myeclipse。

第四步:Java调用本地函数

1 package com.test;
2
3 public class TestNative {
4 public native void sayHello();
5
6 /**
7 * @param args
8 */
9 public static void main(String[] args) {
10 System.loadLibrary("NativeCode");
11 TestNative tNative = new TestNative();
12 tNative.sayHello();
13 }
14 }

  第10行是加载动态链接库,JVM只需要加载一次就可以调用了,“NativeCode”是上面生成的动态链接库的名字,不含后缀名。
  运行该程序,成功打印输出了"hello world"。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
体育运动员谁最有钱? 曲轴箱通风管漏气 有什么现象 曲轴箱强制通风管漏气? 曲轴箱(曲轴箱通风管坏了有什么影响) 100分求CS PING的问题 枇杷有什么作用与功效与作用 枇杷的功效和作用 三星手机大全5660三星手机大全所有型号图片 三星s5660能用动感地带152号段的卡上wlan吗? 我的三星S5660插移动卡就会显示只能进行紧急呼叫,用联通卡没问题,把卡... 为什么说城市交通规划是解决城市交通问题的有效方法 JAVA 里面如何 使用jni 给个例子 加 解释。谢谢 请问jni技术到底是什么?能不能简单的阐述一下? 送对象适合送什么花? 十字路口交通设计方案 如何理解交通枢纽设计的两个依据 交通标识设计考虑哪些要点? 购物中心外部交通动线设计有哪些要求? 由于道路设计问题引发的交通事故该由谁负责?负什么样的责任?请求高人指 ... 交通设计的基本原理包含了怎样的设计逻辑 怎么样按摩胸部,才能让胸部立挺? 华为畅享5移动版能用电信卡吗 黛安芬水立挺好不好 用什么方法能让女人的胸部立挺,坚硬 长续航+高性价比,华为畅享5有电信版吗 华为畅享5电信版能插联通卡吗?还是两个卡槽都插电信? 华为畅享5移动版能上电信卡吗? 华为畅享5能用电信卡吗 华为畅享5有没有电信版解析 华为畅享5能用电信3G卡吗 玫瑰花适合送给什么人玫瑰花适合送给哪些人 Java使用JNI技术、 调用c++的方法、 请问该怎么做? java的jni问题 java 基础问题,请高手指教我下 宋丹丹老公赵玉吉前妻为什么离婚? 大雪说一句话 Java 运行时JNI问题 JAVA怎样用JNI调用动态链接库? 我从来没接触过JNI,就是一点都不知道... Java使用JNI怎么实现调用c++的方法、求 详细步骤、、 SanDiskTF卡(2G),这是什么意思?是什么卡? 赵玉吉的感情生活 TF卡/mi sd卡SanDisk这个牌子的怎么样,有2G的吗? 用过SanDisk 2G TF卡的进 闪迪(SanDisk台湾产)2GB的TF卡被软件写保护了,怎么办? 用大雪纷纷来写一句话 描写雪的一句话 洋芋炒什么最好吃? 宋丹丹继女获国际大奖,亲儿子被批没礼貌,二婚教育真的很难吗? sandisk的U盘和tf卡普遍的传输速率都比较慢吗 sandisk TF卡