`

JNI

阅读更多

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 文件。

      如果是linux下的话:

          g++ -shared -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -m32 -fPIC -o libHello.so HelloWorldImp .c
   6) 运行程序

   java HelloWorld ok



分享到:
评论

相关推荐

    jni.zip jni编译jni下载

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地...

    DELPHI开发JNI必备 jni.pas

    JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java代码和其他语言写的代码提供了一个接口。在Java应用程序中,JNI允许Java代码调用本地(非Java)代码,反之亦然,使得开发者能够利用Java的跨平台...

    JNI的两个头文件jni.h和jni_md.h

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者利用硬件特性等。本文将深入...

    jni.h头文件

    3. **JNI常量**:定义了一些预定义的常量,如`JNI_VERSION_1_1`, `JNI_VERSION_1_2`, `JNI_VERSION_1_4`, `JNI_VERSION_1_6`, `JNI_VERSION_1_8`等,用于表示JNI接口的版本。 4. **JNI环境变量**:`JNIEnv`结构体中...

    jni传递对象数组

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C/C++库或者优化性能时。本篇文章将深入探讨如何在JNI中传递...

    Android通过JNI调用.so动态库

    Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...

    jni.h文件.7z

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用已有的C/C++库,或者为了性能优化而需要直接调用硬件接口时。在这...

    Java jni调用c实例

    Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下被使用,比如优化性能、利用已有的C/C++库或者访问操作系统特定的功能。在这个"Java jni调用...

    Android调用Jni返回自定义对象

    在Android开发中,Java Native Interface (JNI) 是一个关键的工具,它允许Java代码与本地C/C++代码交互。JNI的使用场景广泛,包括优化性能、利用硬件特性、调用已有的C/C++库等。当涉及到Android调用JNI并返回自定义...

    I2CJNI.rar_Android jni_android_android i2c_android i2c通信 JNI_i2c

    在Android系统中,JNI(Java Native Interface)是一种技术,它允许Java代码和其他语言写的代码进行交互。本资源"I2CJNI.rar"似乎包含了一个实际应用的Android I2C通信示例,利用JNI来实现硬件级别的低层通信。I2C...

    JNI入门Demo3.0

    JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中尤为重要,特别是在需要调用C/C++原生代码以提升性能或者利用现有库时。本教程“JNI入门...

    jni中用多线程调用java代码

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常用于提升性能、调用系统库或者实现特定功能,如与C/C++库交互。本项目重点在于如何在JNI...

    jni层内存泄漏检测工具

    JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...

    CTP的JNI封装

    上期技术的CTP接口的JNI封装: (1)网上也有一些实现,不过都挂羊头卖狗肉的,超级鄙视。 (2)testCTP是JAVA的Eclipse工程,执行CTPTest就可以调用起CTP的JNI接口,lib是testCTP工程依赖的jar包,熟悉JAVA的人导入这个...

    jni操作list集合,来存储对象

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常被用来提高性能、调用系统底层库或实现特定功能,例如本例中的操作Java的list集合。在...

    android通过JNI访问硬件LED

    在Android系统中,Java Native Interface (JNI) 是一个关键组件,允许Java代码与其他语言(如C++或C)编写的代码进行交互。本项目聚焦于如何利用JNI来访问硬件资源,特别是控制LED设备。以下是对这个主题的详细阐述...

    jni返回对象数组例子

    Java Native Interface(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在JNI中,我们可以编写C/C++代码来扩展Java应用程序,实现一些Java无法直接完成的功能,比如访问操作系统底层...

    android jni获取 Mac地址

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。当需要执行一些性能敏感或者Java无法直接处理的任务时,开发者通常会利用JNI调用C/C++原生代码。本话题关注的...

    JNI处理hashmap,string等对象的操作

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者实现与硬件设备的直接通信。在...

    jni4net-0.8.8.0.zip

    JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。jni4net简化了这个过程,使得开发者无需深入理解复杂的JNI接口。 标签“jni4net”、“java”、“dll”、“C#”揭示了主要涉及的技术领域。jni4net...

Global site tag (gtag.js) - Google Analytics