`
left.jessica
  • 浏览: 32854 次
  • 性别: 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学习教程,下面我们将深入探讨JNI的相关知识点。 1. **JNI概述** JNI是一种接口,使得Java应用程序可以调用本地(非Java)代码,也可以让本地代码调用...

    JNI实现示例DEMO

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统API、优化性能关键部分或者利用已有的C/C++库。本DEMO将向你...

    Jni_Ndk开发最简单的例子

    本教程将通过一个简单的例子来介绍如何使用JNI和NDK进行开发。 首先,我们需要创建一个Android项目,包含一个简单的按钮和一个TextView。按钮的作用是触发JNI函数的调用,而TextView则用来显示JNI函数返回的结果。...

    android上jni最简单的学习实例hello的源代码

    这个"android上JNI最简单的学习实例hello的源代码"是一个基础的教程,用于帮助开发者理解如何在Android应用中使用JNI技术。下面将详细解释这个实例中的关键知识点。 1. **JNI的基本概念**: JNI提供了一种方式,让...

    jni返回对象数组例子

    Java Native Interface(JNI)是Java平台的标准组成部分,它允许...这就是一个简单的JNI返回对象数组的例子。通过这种方式,我们可以灵活地在Java和本地代码之间传递复杂的数据结构,极大地扩展了Java应用程序的能力。

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

    这个简单的示例对于初学者理解JNI和NDK开发至关重要,因为它展示了从创建本地方法到在Java中调用这些方法的完整过程。通过深入研究和修改这个示例,开发者可以进一步学习如何处理更复杂的任务,如使用C/C++库、处理...

    jni调用第三方dll最简单的实例

    本实例将深入浅出地介绍如何通过JNI调用第三方DLL库,并以最简单的整型参数传递为例,帮助初学者快速理解JNI的工作原理。 首先,我们需要创建一个Java类,声明native方法。在Java中,我们使用`native`关键字来标记...

    关于JNI的小例子 实现java与C++的方法互调

    这个简单的例子展示了JNI的基本用法,实际应用中可能涉及到更复杂的类型转换、异常处理和多线程问题,但基础原理是一样的。通过熟练掌握JNI,开发者可以在Android应用中充分利用C++的优势,提高程序性能和效率。

    一个简单的jni显示Dialog的例子

    本例子展示了如何通过JNI在Android应用中显示一个Dialog。 首先,我们需要创建一个本地方法(native method)在Java类中声明,这个方法将在C/C++代码中实现。例如: ```java public class MainActivity extends ...

    JNI的简单实例

    JNI(Java Native Interface)是Java平台的一个重要组成部分,它允许Java代码和其他语言写的代码进行交互。...通过理解并实践这个例子,开发者可以更好地掌握JNI的使用,为更复杂的系统集成和性能优化打下基础。

    Jni多线程同步事例

    以下是一个简单的JNI和生产者-消费者模型的代码片段: ```java // Java部分 public native void produce(); public native void consume(); ``` ```c // C部分 #include "YourClassName.h" #include ...

    简单的JNIdemo

    在这个"简单的JNIdemo"中,我们将深入探讨JNI的基本概念、工作原理以及如何创建和运行一个简单的示例。 首先,我们需要理解JNI的核心功能。JNI提供了一种方式,让Java代码可以声明并调用本地方法,这些方法是由非...

    jni接口实现最简单案例源代码

    这个“jni接口实现最简单案例源代码”应该是提供了一个基础的示例,帮助开发者理解如何在Java程序中使用JNI。 首先,JNI的核心概念是Java本地方法(Native Method),这是一种可以被Java虚拟机(JVM)调用的非Java...

    最简单的JNI编程-实现两个数相加

    在这个例子中,会生成一个`NativeMethod.h`,包含Java方法到C/C++函数的映射。 3. **编写C/C++代码**:根据生成的头文件,实现native方法的具体逻辑。例如: ```c++ #include "NativeMethod.h" JNIEXPORT jint ...

    ubuntu下第一个Jni例子

    这篇博客将引导我们完成在Ubuntu环境下创建并运行一个简单的JNI示例。 首先,我们需要了解JNI的基本概念。JNI接口提供了Java虚拟机(JVM)与本地代码之间的桥梁。当Java程序需要执行一些只能由原生代码完成的任务时...

    java jni 简单教程

    在这个例子中,函数简单地打印出"Hello world!"。 完成本地代码编写后,需要使用C/C++编译器(如Microsoft Visual C++)来编译源文件,生成动态链接库(如`hello.dll`)。最后,运行Java程序,`main`方法会调用`...

    Android Studio2.2中JNI的简单使用代码

    本篇文章将围绕Android Studio 2.2中JNI的简单使用进行详解。 首先,我们需要了解在Android Studio 2.2中如何设置JNI环境。打开项目结构设置(File &gt; Project Structure),在模块设置(Module)中选择相应的...

    动态注册JNI方法写hello jni

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许...通过这个简单的"Hello JNI"例子,你应该对动态注册有了初步的理解。在实际开发中,可以根据需求扩展这些基础知识,实现更复杂的本地功能。

    Android_JNI例子

    例如,一个简单的JNI函数可能如下所示: ```cpp #include &lt;jni.h&gt; JNIEXPORT void JNICALL Java_com_example_MyActivity_myNativeFunction(JNIEnv *env, jobject /* this */) { // 在这里实现C/C++的代码 } ``` ...

    jni调用第三方dll最简单的实例.rar

    在描述的"jni调用第三方dll最简单的实例"中,我们可能包含以下几个步骤: 1. **编写Java代码**:创建一个Java类,声明一个`native`方法,这个方法将被第三方DLL实现。例如: ```java public class NativeDemo { ...

Global site tag (gtag.js) - Google Analytics