JNI(Java Native Interface)是SUN定义的一套标准接口,供本地(C/C++)应用与Java VM互调。因为C/C++在系统编程领域的地位,只要打通了与C/C++的接口就等于是天堑变通途。
使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。
1. 编写带有native声明的方法的java类
2. 使用javac命令编译所编写的java类
3. 然后使用javah 生成扩展名为h的头文件
4. 使用C/C++实现本地方法
5. 将C/C++编写的文件生成动态连接库
6. java程序中调用该动态链接库完成应用。
下边一步步的完成,使用的工具有 jdk eclipse vc
1,在eclipse中新建java工程“JNIStudy”,创建包“com.study.jni”,创建NativeHello类。
package com.study.jni;
publicclass NativeHello { //声明native方法 publicnativevoid HelloWorld(String str); //加载hello动态链接库,这个在后边生成。 static { System.loadLibrary("hello"); }
}
|
声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明该方法为native的,并且不能实现。
System.loadLibrary("hello");加载动态库,一般是以static块进行加载的,需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
2,由于eclipse中的文件是自动编译的,在项目中可以看到已经编译好的类文件。如果没有编译话需要手动编译。
3,下边需要手动生成头文件,通过在运行框中输入cmd打开命令行,
先输入项目所在的盘符,然后进入项目所在路径,输入以下命令,生成头文件。
Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>d:
D:\>cd D:\workspace\JNIStudy\bin
D:\workspace\JNIStudy\bin>javah com.study.jni.NativeHello
D:\workspace\JNIStudy\bin> |
注意生成头文件的路径是在生成类文件的根目录(bin)下,这个文件中不要有中文,否则在生成头文件时不报错,但生成的文件内容不完全。
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_study_jni_NativeHello */
#ifndef _Included_com_study_jni_NativeHello #define _Included_com_study_jni_NativeHello #ifdef __cplusplus extern "C" { #endif /* * Class: com_study_jni_NativeHello * Method: HelloWorld * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_com_study_jni_NativeHello_HelloWorld (JNIEnv *, jobject, jstring);
#ifdef __cplusplus } #endif #endif |
4,在vc中新建动态链接库工程,工程名与刚才需要加载的一致hello
点击ok,然后创建一个空的dll项目。
5 新建文件hello.cpp,保存在项目的根目录下
然后输入内容
#include <jni.h> #include "com_study_jni_NativeHello.h"
JNIEXPORT void JNICALL Java_com_study_jni_NativeHello_HelloWorld(JNIEnv *env, jobject obj, jstring jstr) { const char* str = env->GetStringUTFChars(jstr,0); printf(str); env->ReleaseStringUTFChars(jstr,str); return; } |
然后把这个文件添加到vc项目中,
拷入上一步生成头文件和下边的头文件%JAVA_HOME%\include jni.h到VC项目的根目录下,同样的把文件添加到VC的项目中。注意是在头文件中加入。
如果幸运的话,可以如上图所示,如果有错误的,根据提示进行解决。
下边就可以在eclipse中使用这个本地方方法了。
6,编写调用文件,并加入生成动态链接库文件到项目中
package com.study.jni;
publicclass HelloWorld {
/** * @param args */ publicstaticvoid main(String[] args) { NativeHello nh=new NativeHello(); nh.HelloWorld("Hello native method !"); }
} |
如果这个动态链接库文件放的路径不对,将会引用不到而报错,
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
意思是说在这个环境变量中找不到这个引用。有很多办法解决。我的方法是通过eclipse的导入功能,把这个文件以文件的方式导入到项目中。
选择hello.dll文件,即可导入,导入成功后文件实际是放在项目的根目录下。
或者还可以通过查看System.out.println(System.getProperty("java.library.path"));的值来放到可以加载的地方。
终于完成!然后运行程序,就可以看到结果了
“I am loading the native method !”
相关推荐
在安卓平台上进行串口通信,通常涉及到硬件交互、Socket编程以及JNI(Java Native Interface)技术。这个"安卓串口调试助手"项目显然旨在提供一种工具,帮助开发者测试和调试通过USB连接的串口设备。以下是对相关...
在IT领域,尤其是在嵌入式系统和物联网应用中,设备之间的通信...综上所述,这个项目涉及到的是一套复杂但实用的通信方案,对于希望深入了解Android硬件交互、USB通信和网络编程的开发者来说,这是一个极好的实践案例。
### Java本地接口(JNI)编程指南和规范 #### 引言与背景 本书全面介绍了Java本地接口(JNI),这是连接Java代码与本地语言(如C和C++)编写的应用程序或库的重要桥梁。JNI旨在促进Java与其他编程环境之间的无缝集成...
综上所述,本书是关于JNI编程的一份全面指南,它集合了实践中的经验、技术讨论、规范定义、和设计原理。读者通过阅读本书可以深刻理解JNI的设计哲学和技术细节,从而在多语言编程环境中编写出更高效、更可靠的Java...
2. **JNI**:JNI是Java平台的标准编程接口,允许Java代码和其他语言写的代码进行交互。在Android中,JNI通常用来调用C/C++的原生库,提高性能或利用现有的C/C++代码库。在这个案例中,JNI被用来实现RSA和3DES的加密...
总结起来,"JNI实例Android"是关于在Android系统上,特别是在Mstar平台上,如何利用JNI技术进行个人资料备份的实践案例。它展示了JNI在实现特定平台功能、提高性能和与硬件接口交互方面的重要作用。通过学习和理解这...
【标题】"C++课程设计-个人收支管理系统"是一个典型的软件工程实践项目,旨在帮助学生应用C++编程语言来构建一个实用的财务管理工具。在这个项目中,学生将学习到如何设计、实现和测试一个功能完备的个人收支管理...
该书详细讲解了从基础到进阶的Android多媒体编程技术,内容覆盖了多媒体开发的多个方面,如图像、音频和视频框架的应用,共享内存、IPC通信、HAL(硬件抽象层)、原生服务、JNI(Java Native Interface)调用等。...
以下是一些关键的安全编程概念和实践,它们是Java安全性编程的基础。 1. 类加载器与权限:Java使用类加载器来隔离不同源的代码,每个类加载器都有自己的命名空间。不同的类加载器加载的类可以有不同的权限,这有助...
Android是基于Linux内核的操作系统,因此熟悉Android的SDK、NDK以及JNI编程对于在REAL6410这样的硬件平台上开发应用程序至关重要。这涵盖了如何构建系统映像、调试应用程序以及优化性能等方面的知识。 总的来说,...
1. **《代码大全》**:这本书提供了大量的编程技巧和最佳实践,对于提升编程能力非常有帮助。 2. **《重构》**:重构是软件开发中的一个重要环节,这本书详细介绍了如何通过重构来改善现有代码的质量。 3. **《设计...
Java软件高级工程师是专注于j2EE平台的开发者,具备深厚的技术功底和丰富的实践经验。他们主要负责基于Java的企业级应用开发,包括但不限于Web应用程序、企业信息系统和分布式服务。在j2EE方向,工程师需要熟练掌握...
OpenGLES2.0是移动设备上的一个图形处理标准,主要应用于iOS和Android平台的游戏与图形编程。这个标准是OpenGL ES(OpenGL for...通过深入阅读书籍和实践其中的源码,不仅可以提升个人技能,也有助于拓宽职业发展道路。
【蓝桥杯第三届JAVA软件开发高职高专组个人赛选拔赛真题】是针对高职高专学生进行的一场专业性的JAVA编程技能竞赛。这个赛事旨在检验参赛者的JAVA软件开发能力,提升他们的实践技能,同时也为他们提供了一个展示自我...
- 第14章介绍Java其他编程,包括JNI和一些与系统有关的编程技术的应用。 - 第15章介绍了Java工具和服务器配置与集成,包括各种开发环境的安装和配置。 本书的特点在于内容丰富、结构合理、叙述简洁明了,具有很强的...
**标题与描述解析:** “ndk相关笔记”这一标题明确指向了Android Native Development Kit(NDK)的相关内容,而描述“自己学ndk开发时的一些总结,希望对你有帮助”则暗示了这些笔记是基于个人学习和实践经验的总结...
JavaSCJP,全称为Sun Certified Programmer for the Java 2 Platform, Standard Edition,是Oracle公司(原Sun ...同时,不断练习和实践是巩固知识的关键,希望这份个人笔记能对你的学习有所帮助,一起加油,共同进步!
6. **接口与API设计**:gcj与Java标准库的交互是通过特定的接口实现的,这涉及到JNI(Java Native Interface)和C/C++编程,有助于理解二者的协同工作方式。 7. **开源协作**:作为开源项目的一部分,gcj的源代码...