`
duankesong
  • 浏览: 12800 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JNI 编程 --个人实践

 
阅读更多

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.hVC项目的根目录下,同样的把文件添加到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 !

 

 

2
0
分享到:
评论

相关推荐

    安卓串口Socket通讯USB驱动jni相关-安卓串口调试助手.rar

    在安卓平台上进行串口通信,通常涉及到硬件交互、Socket编程以及JNI(Java Native Interface)技术。这个"安卓串口调试助手"项目显然旨在提供一种工具,帮助开发者测试和调试通过USB连接的串口设备。以下是对相关...

    安卓串口Socket通讯USB驱动jni相关-PC与Android设备通过USB建立通信连接通过socket收发数据.rar

    在IT领域,尤其是在嵌入式系统和物联网应用中,设备之间的通信...综上所述,这个项目涉及到的是一套复杂但实用的通信方案,对于希望深入了解Android硬件交互、USB通信和网络编程的开发者来说,这是一个极好的实践案例。

    Java本地接口(JNI)编程指南和规范.pdf

    ### Java本地接口(JNI)编程指南和规范 #### 引言与背景 本书全面介绍了Java本地接口(JNI),这是连接Java代码与本地语言(如C和C++)编写的应用程序或库的重要桥梁。JNI旨在促进Java与其他编程环境之间的无缝集成...

    Java 本地接口(JNI)编程指南和规范

    综上所述,本书是关于JNI编程的一份全面指南,它集合了实践中的经验、技术讨论、规范定义、和设计原理。读者通过阅读本书可以深刻理解JNI的设计哲学和技术细节,从而在多语言编程环境中编写出更高效、更可靠的Java...

    android rsa jni 加密demo

    2. **JNI**:JNI是Java平台的标准编程接口,允许Java代码和其他语言写的代码进行交互。在Android中,JNI通常用来调用C/C++的原生库,提高性能或利用现有的C/C++代码库。在这个案例中,JNI被用来实现RSA和3DES的加密...

    JNI实例Android

    总结起来,"JNI实例Android"是关于在Android系统上,特别是在Mstar平台上,如何利用JNI技术进行个人资料备份的实践案例。它展示了JNI在实现特定平台功能、提高性能和与硬件接口交互方面的重要作用。通过学习和理解这...

    c++课程设计-个人收支管理系统.rar

    【标题】"C++课程设计-个人收支管理系统"是一个典型的软件工程实践项目,旨在帮助学生应用C++编程语言来构建一个实用的财务管理工具。在这个项目中,学生将学习到如何设计、实现和测试一个功能完备的个人收支管理...

    [Android多媒体编程从初学到精通].苗忠良等.扫描版.pdf

    该书详细讲解了从基础到进阶的Android多媒体编程技术,内容覆盖了多媒体开发的多个方面,如图像、音频和视频框架的应用,共享内存、IPC通信、HAL(硬件抽象层)、原生服务、JNI(Java Native Interface)调用等。...

    Java安全性编程指南

    以下是一些关键的安全编程概念和实践,它们是Java安全性编程的基础。 1. 类加载器与权限:Java使用类加载器来隔离不同源的代码,每个类加载器都有自己的命名空间。不同的类加载器加载的类可以有不同的权限,这有助...

    LINUX系统分析与高级编程技术

    Android是基于Linux内核的操作系统,因此熟悉Android的SDK、NDK以及JNI编程对于在REAL6410这样的硬件平台上开发应用程序至关重要。这涵盖了如何构建系统映像、调试应用程序以及优化性能等方面的知识。 总的来说,...

    Android应用开发者成长计划

    1. **《代码大全》**:这本书提供了大量的编程技巧和最佳实践,对于提升编程能力非常有帮助。 2. **《重构》**:重构是软件开发中的一个重要环节,这本书详细介绍了如何通过重构来改善现有代码的质量。 3. **《设计...

    精品专题(2021-2022年收藏)java软件高级工程师jEE方向linux初级开发工程师jEE方向简历模板.doc

    Java软件高级工程师是专注于j2EE平台的开发者,具备深厚的技术功底和丰富的实践经验。他们主要负责基于Java的企业级应用开发,包括但不限于Web应用程序、企业信息系统和分布式服务。在j2EE方向,工程师需要熟练掌握...

    OpenGLES2.0游戏与图形编程适用于iOS 和Android源码

    OpenGLES2.0是移动设备上的一个图形处理标准,主要应用于iOS和Android平台的游戏与图形编程。这个标准是OpenGL ES(OpenGL for...通过深入阅读书籍和实践其中的源码,不仅可以提升个人技能,也有助于拓宽职业发展道路。

    蓝桥杯第三届JAVA软件开发高职高专组个人赛选拔赛真题

    【蓝桥杯第三届JAVA软件开发高职高专组个人赛选拔赛真题】是针对高职高专学生进行的一场专业性的JAVA编程技能竞赛。这个赛事旨在检验参赛者的JAVA软件开发能力,提升他们的实践技能,同时也为他们提供了一个展示自我...

    Java案例精粹150例

    - 第14章介绍Java其他编程,包括JNI和一些与系统有关的编程技术的应用。 - 第15章介绍了Java工具和服务器配置与集成,包括各种开发环境的安装和配置。 本书的特点在于内容丰富、结构合理、叙述简洁明了,具有很强的...

    ndk相关笔记

    **标题与描述解析:** “ndk相关笔记”这一标题明确指向了Android Native Development Kit(NDK)的相关内容,而描述“自己学ndk开发时的一些总结,希望对你有帮助”则暗示了这些笔记是基于个人学习和实践经验的总结...

    JavaScjp大纲讲解官方中文

    JavaSCJP,全称为Sun Certified Programmer for the Java 2 Platform, Standard Edition,是Oracle公司(原Sun ...同时,不断练习和实践是巩固知识的关键,希望这份个人笔记能对你的学习有所帮助,一起加油,共同进步!

    gcc-java-3.4.2-20040916-1-src.tar.gz_4 3 2 1

    6. **接口与API设计**:gcj与Java标准库的交互是通过特定的接口实现的,这涉及到JNI(Java Native Interface)和C/C++编程,有助于理解二者的协同工作方式。 7. **开源协作**:作为开源项目的一部分,gcj的源代码...

Global site tag (gtag.js) - Google Analytics