• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > Java进阶:JNI使用技巧点滴

Java进阶:JNI使用技巧点滴

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了java jni教程,java jni,java调用jni,jni c调用java,java jni调用dll等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
文章来源:csdn 作者:normalnotebook

 摘要

   本文为在 32 位 Windows 平台上实现 Java 本地方法提供了实用的示例、步骤和准则。本文中的示例使用 Sun Microsystems 公司创建的 Java Development Kit (JDK) 版本 1.4.1。用 C 语言编写的本地代码是用 Microsoft Visual C++ 编译器编译生成。

  简介

  近日,由于项目需要,要在WEB页面实现图像转换功能,而VC在图像转换方面有着得天独厚的优势。我们首先用VC封装出图像转换的DLL,然后用JAVA的本地化方法JNI调用用于图像转换的DLL,最后用JavaBean调用JNI生成的DLL。

  通过近几天在网上找资料和自己的摸索,收获很多,现总结如下,让以后做这方面的人少走弯路。

  一. JAVA部分

  1. 无包的情况:

  实例一:


  public class MyNative

  {

  static

  {

  System.loadLibrary( "MyNative" );           

  }

  public native static void HelloWord();

  public native static String cToJava();

  }

  说明:

  1)在JAVA程序中,首先需要在类中声明所调用的库名称System.loadLibrary( String libname );,在库的搜寻路径中定位这个库。定位库的具体操作依赖于操作系统。在windows下,首先从当前目录查找,然后再搜寻”PATH”环境变量列出的目录。如果找不到该库,则会抛出UnsatisfiedLinkError。

  2)这里加载的是JNI生成的DLL,而不是其他生成的DLL的名称。 在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。

 3) 还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。 实现放在C中实现,稍后将做说明。

  4)如果加了static,表明是静态方法。如果不加,表明是一般的方法。加与不加,生成的头文件中有一个参数不同。稍后将做说明。

  现在开始编译它:

  用javac MyNative.h编译它,生成对应的class文件。

  用javah MyNative ,就会生成对应的MyNative.h头文件。剩下的是就开始交给VC来完成了(我们用VC来实现对应的C实现部分)。

  2. 有包的情况:

  实例二:


  package  com..myNative;

  public class MyNative

  {

  static

  {

  System.loadLibrary( "MyNative" );           

  }

  public native static void HelloWord();

  public native static String cToJava();

  }

  其他与上面相同,就是在用javac和javah时有所不同。对于有包的情况一定要注意这一点,开始时我的程序始终运行都不成功,问题就出在这里。


  javac  ./com/myNative/MyNative.java

  javah  com.myNative.MyNative

  上面一句就不用解释了。对下面的一句解释一下:本类的前面均是包名。这样生成的头文件就是:com.myNative.MyNative.h。 开始时,在这种情况下我用javah MyNative生成的头文件始终是MyNative.h。在网上查资料时,看见别人的头文件名砸那长,我的那短。但不知道为什么,现在大家和我一样知道为什么了吧。:)。有时还需要带上路径。具体查看javah的语法。

 二.C实现部分

  刚才用javah MyNative生成的MyNative.h头文件内容如下:


  /* DO NOT EDIT THIS FILE - it is machine generated */

  #include <jni.h>

  /* Header for class MyNative */

  #ifndef _Included_MyNative

  #define _Included_MyNative

  #ifdef __cplusplus

  extern "C" {

  #endif

  /*

  * Class:     MyNative

  * Method:    HelloWord

  * Signature: ()V

  */

  JNIEXPORT void JNICALL Java_MyNative_HelloWord (JNIEnv *, jclass);

  /*

  * Class:     MyNative

  * Method:    cToJava

  * Signature: ()Ljava/lang/String;

  */

  JNIEXPORT jstring JNICALL Java_MyNative_cToJava  (JNIEnv *, jclass);

  #ifdef __cplusplus

  }

  #endif

  #endif

 接下来,就是如何实现它了。其实,用JNI作出的东西也是DLL,被JAVA所调用。

  在具体实现的时候,我们只关心两个函数原型:


  JNIEXPORT void JNICALL Java_MyNative_HelloWord(JNIEnv *, jclass);和JNIEXPORT jstring JNICALL Java_MyNative_cToJava(JNIEnv *, jclass);

  现在让我们开始激动人心的第一步吧 : ) 。在project里面选择win32 Dynamic-link Library,然后点击下一步,其余的取默认。如果不取默认的,将会有dllmain()函数。取空DLL工程的话,将无这个函数。我在这里取的是空。

  然后选择new->File->C++ Source  File,生成一个空*.cpp文件。我们把他取名为MyNative。把JNIEXPORT void JNICALL Java_MyNative_HelloWord(JNIEnv *, jclass);和JNIEXPORT jstring JNICALL Java_MyNative_cToJava(JNIEnv *, jclass);拷贝到CPP文件中去。然后把头文件包含进来。

  生成的MyNative.cpp内容如下:


  #include <stdio.h>

  #include "MyNative.h"

  JNIEXPORT void JNICALL Java_MyNative_HelloWord  (JNIEnv *env, jclass jobject)

  {

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Java进阶:JNI使用技巧点滴

相关文章

  • 2017-05-28Java中的FilterOutputStream 简介_动力节点Java学院整理
  • 2017-05-28PipedWriter和PipedReader源码分析_动力节点Java学院整理
  • 2017-05-28Intellij IDEA 配置Subversion插件实现步骤详解
  • 2017-05-28Java中的FilterOutputStream 简介_动力节点Java学院整理
  • 2017-05-28Java中sleep()与wait()的区别总结
  • 2017-05-28java中hibernate二级缓存详解
  • 2017-08-27Java中的内部类
  • 2017-05-28SpringMVC实现数据绑定及表单标签
  • 2017-05-28Java进阶学习:jar打包详解
  • 2017-05-28Java使用强大的Elastisearch搜索引擎实例代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详解Spring MVC事务配置
    • SpringBoot拦截器的使用小结
    • IDEA上面搭建一个SpringBoot的web-mvc项目遇到的问题
    • Java中多线程通信实例:生产者消费者模式
    • Java中的 FilterInputStream简介_动力节点Java学院整理
    • java编译时与运行时概念与实例详解
    • listview点击无效的处理方法(推荐)
    • java实现cassandra高级操作之分页实例(有项目具体需求)
    • Java代码注释规范(动力节点整理)
    • Spring Boot 开发私有即时通信系统(WebSocket)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有