`
left.jessica
  • 浏览: 32184 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JNI最简单的例子

阅读更多

转载自http://java.chinaitlab.com/JDK/36677.html
  
  1.简介
  
  JNI是Java Native Interface的缩写,它的设计目的是:
  
  The standard Java class library may not support the platform-dependent features needed by your application.
  
  You may already have a library or application written in another programming language and you wish to make it accessible to Java applications
  
  You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions
  
  2.JNI的书写步骤
  
  编写带有native声明的方法的java类
  
  使用javac命令编译所编写的java类
  
  使用javah ?jni java类名生成扩展名为h的头文件
  
  使用C/C++实现本地方法
  
  将C/C++编写的文件生成动态连接库
  
  ok
  
  1) 编写java程序:
  
  这里以HelloWorld为例。
  
  代码1:
  
  class HelloWorld {
  public native void displayHelloWorld();
  
  static {
  System.loadLibrary("hello");
  }
  
  public static void main(String[] args) {
  new HelloWorld().displayHelloWorld();
  }
  }
  
  声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。
  
  Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
  
  main()方法
  
  2) 编译没有什么好说的了
  
  javac HelloWorld.java
  
  3) 生成扩展名为h的头文件
  
  javah ?jni HelloWorld
  
  头文件的内容:
  /* DO NOT EDIT THIS FILE - it is machine generated */
  #include <jni.h>
  /* Header for class HelloWorld */
  
  #ifndef _Included_HelloWorld
  #define _Included_HelloWorld
  #ifdef __cplusplus
  extern "C" {
  #endif
  /*
  * Class:   HelloWorld
  * Method:  displayHelloWorld
  * Signature: ()V
  */
  JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);
  
  #ifdef __cplusplus
  }
  #endif
  #endif
  
  (这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。
  
  4) 编写本地方法
  
  实现和由javah命令生成的头文件里面声明的方法名相同的方法。
  
  代码2:
  
  1 #include <jni.h>
  2 #include "HelloWorld.h"
  3 #include <stdio.h>
  4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
  {
  printf("Hello world!\n");
  return;
  }
  
  注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为HelloWorldImpl.c就ok了。
  
  5) 生成动态库
  
  这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。
  
  cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll
  
  注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。
  
  6) 运行程序
  
  java HelloWorld就ok。

 

 

关于dll文件的生成以及找不到jni.h的解决办法
2008-11-08 17:07

 

首先是关于dll文件的生成:

方法如下:

打开VC++6.0,新建->; 工程 ->; win32 Dynamic-Link Library在向导中选择空工程

添加如用javah生成的头文件和自己写的一个cpp文件,然后编译运行,如果没有出现错误,既可以在编译成功的debug文件夹中找到dll文件,如果出现找不到jni.h的错误,那么用如下方法解决:

fatal error C1083: Cannot open include file: 'jni.h': No such file or directory
将以下文件:

\jdk\include\jni.h

\jdk\include\win32\jawt_md.h

\jdk\include\win32\jni_md.h

复制到Visual Studio.net的安装目录下的\Vc7\include目录中

如果是VC6.0,自己找相应的目录即可!

 

然后运行cl -LD HelloWorldImp.c -Fehello.dll 即可

 

附上自己运行的图片两张:

 

 

分享到:
评论

相关推荐

    jni最简单例子,注释详细

    jni最简单例子,注释详细

    Jni_Ndk开发最简单的例子

    Jni_Ndk开发最简单的例子,一个简单的按钮,当点击按钮之后,调用JNI 返回值到上层,然后更新TextView

    ndk自带的最简单的jni例子hello-jni

    ndk自带的最简单jni例子:hello-jni

    Jni中C++和Java的参数传递

    如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用VC++6.0实现JNI的最简单的例子 

    JNI调用C代码的例子

    最简单的java调用c的demo。可以一目了然的看懂整个流程。用于学习jni。

    Qt(5.9) for Android(6.0) 调用JNI接口运行JAVA代码

    在QT上使用JNI接口调用JAVA代码,内有2个压缩包一个README文档,1个压缩包是在QT上使用最简单的JNI接口例子,另一个是我写的在QT上使用jNI接口调用源生安卓界面的一些功能,如系统时间设置和以太网设置。

    android jni和NDK简单案例(.so库调用)

    android jni和NDK简单案例(.so库调用),下载文件,androidstudio上运用,最好时在模拟器上测试(只x86兼容)

    android从HAL,jni,到app学习心得,绝对原创

    这是本人学习android2个月以来的心得,从hal层到jni,再到app的学习体验,文档中的源代码是,我学习中试着编写的最简单的对硬件的从底层到应用层的例子,是在android4.0.3系统下做的,初学者看了会能帮助你加快对...

    基于Frida的工具,可跟踪Android应用程序中JNI API的使用。-Android开发

    jnitrace Frida模块,用于跟踪Android应用程序中JNI API的使用。 Android Apps中包含的本机库通常使用JNI API来利用Android Runtime...安装:运行jnitrace的最简单方法是使用pip安装:pip install jnitrace依赖项:pip

    JNI技术手册 c/c++调用java

    三、 嵌入式开发应用(JNI小例子) 20 1、 新增一个基础类 22 2、 定义新类继承基础类 23 3、 编写调用类 23 4、 新增两个本地方法 24 5、 修改 RunMain 类 25 6、 新增一个方法处理java对象 26 7、 新增一个方法处理...

    java写dll接口源码-JNI-By-Examples::sparkler:有趣的JavaJNI示例-使用CMake和C++(当然也可以是C!):double_exclamation_mark:接受PR

    的编程非常简单,其中最困难的一点是从 jar 文件中实际加载动态库。 如果您擅长 C/C++,那么在阅读一些材料后,您将很容易上手。 注 2 :这个例子还向您展示了如何使用CMake为 JNI 编译源文件! 这是 Java 的 JNI 的...

    android NDK中c和java大数据交换

    android NDK中c和java大数据交换。以一个很简单的例子,介绍如何在java中申请数组,然后将数组传递给c,最后将处理结果以数组的形式返回给java。希望给新手一点帮助。代码具体解释见本人博客

    JNative用java调用动态库VC++

    因工作的缘故,有机会接触了Java本地方法调用...使用Java的JNI调用C/C++的动态联结库有个固定的步骤,下面将以一个最简单的HelloWorld例子程序来说明调用过程。这个HelloWorld的例子只是简单的显示HelloWorld消息。

    JAVA上百实例源码以及开源项目源代码

    2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    新版Android开发教程.rar

    也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...

Global site tag (gtag.js) - Google Analytics