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

如题所述

 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"。
温馨提示:内容为网友见解,仅供参考
无其他回答

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

Java使用jna调用c++动态库(Linux)
1. JNA,全名Java Native Access,是基于JNI技术的Java开源框架,旨在简化Java与C++库的交互。开发人员仅需在Java接口中描述库函数和结构,JNA会自动映射这些接口到实际的C++函数。2.为了开始,首先从官网下载并导入jna-5.9.0.jar库到项目。接下来,通过在Java项目中创建一个继承自Library接口的自定义接...

NDK 系列(5):JNI 从入门到实践,爆肝万字详解!
1. JNI基础与动机JNI是Java与C\/C++交互的关键,Java调用C\/C++代码的原因有四个:性能需求、特定功能、跨平台兼容和利用已有的C\/C++库。JNI的实现依赖于Java虚拟机的C\/C++底层实现,通过它在Java和C世界之间搭建桥梁。2. JNI开发流程标准JNI流程包含:认识JNI、Java与C\/C++交互、性能误区识别、注册JNI...

请教JNI编程中C调用Java实现中NullPointerException问题
1、java 调用C++编写的dll,可使用JNI 或 Jawin 开源项目(推荐第二种方法)。2、C++ 调用java 的变量、方法,通过JNI (Java Native Interface)与java类交互。---操作步骤(只总结第二个)--- (1) vc6.0编译C++程序,开发环境设置:工具--》选项--》工具,工具标签下:选择“include files”...

Java使用jna调用c++动态库(Linux)
Java Native Access (Jna) 是一个用于调用 C\/C++ 动态库的 Java 开源框架,无需编写任何 native\/JNI 代码。开发人员只需在 Java 接口中描述函数库的函数和结构,Jna 将自动实现 Java 接口方法与函数的映射。在使用 Jna 调用 C++ 动态库时,首先需要下载并导入 Jna-5.9.0.jar 库到 Java 项目中...

关于jni方法调用本地vc++程序,c++程序中含有包含的头文件和lib库文件...
1.编写java部分,本地方法用关键字native表示,不用带方法体, 如:private native void helloworld();2.使用命令行,linux与windos一样,在.java文件目录中使用javac,将其专为.class文件。若java部分带包,则在包的 上一级使用javah,如bin\\com\\fhy\\jnitest\\HelloWorld.class 则...

Android NDK Jni 开发C和C++的区别
1.先来一个用C写的例子:(1)hello.c文件。在C中没有引用,传递的env是个两级指针,用(*env)->调用方法且方法中要传入env.1 #include <jni.h> 2 3 jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) { 4 return (*env)->NewStringUTF(env,"Hello Jni--->C!"...

JNI中实现类似C++回调方法-结构体操作
如果这里不知道如何获取方法,可以结合java结构体自动生成的函数一一对应。4:类型转换想要让Java识别C++的数据,我们就需要对类型进行转换,依据DataSt中的两种结构类型进行处理转换 4.1:string -> jstring假设:string id = "123";jstring jname = mJni->NewStringUTF(str.c_str());4.2:int类型...

JAVA 里面如何 使用jni 给个例子 加 解释。谢谢
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:public native static void set(int i);public native static int get();然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C\/C++的头文件。例如程序testdll.java,内容为:public class test...

c\/c++和java通信 如何接受结构体
结构体的目的就是要格式化一串数据。你所说的传递结构体就是传递这块数据。c\/c++和java通信的数据流你应该知道吧,就是利用java的本地JNI和C\/C++通信。你可以传递这块数据流到目的地后强制转换为传递前结构体的类型。

相似回答