`
747017186
  • 浏览: 334169 次
社区版块
存档分类
最新评论

jni学习实例(4)

    博客分类:
  • java
 
阅读更多

原文转:http://www.jb51.net/article/92121.htm

1. JNI简介

JNI是Java Native Interface的英文缩写,意为Java本地接口。

问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究)。

解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发。

2. JNI快速学习教程

2.1 问题:

使用JNI写一段代码,实现string_Java_Test_helloworld(JNIEnv *env, jclass cls , jstring j_str)函数,实现在字符串j_str("world")前面加上hello,并返回。

2.2 解决问题过程:

I. 编写Test.java类:

1
2
3
4
5
6
7
8
9
10
11
12
public class Test{
  // native interface
  public native String helloworld(String text);
   
  public static void main(String[] args){
    // Load dynamic library
    System.loadLibrary("Test2");
    Test ts = new Test();
    String text = ts.helloworld("world");
    System.out.println(text);
  }
}

备注:

1、加载动态类库:System.loadLibrary("Test2");【Windows下加载的就是Test2.dll,Linux下加载的是Test2.so】

II. 编译Test.java文件

进入cmd输入命令 > javac Test.java

III. 生成Test.h文件

进入cmd输入命令 > javah Test

Test.h文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test */
 
#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:   Test
 * Method:  helloworld
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Test_helloworld
 (JNIEnv *, jobject, jstring);
 
#ifdef __cplusplus
}
#endif
#endif

备注:

1、函数声明,固定格式:JNIEXPORT;返回类型:jstring;JNI调用:JNICALL;Java_完整类名_方法名:Java_Test_helloworld;

2、函数参数:调用jni.h封装好的函数指针:JNIEnv;Java类本身:jobject,Java文件传入参数:jstring。

IV. 编写C语言文件Test2.c实现Test类调用动态链接库的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Test.h"
#include <string.h>
 
JNIEXPORT jstring JNICALL Java_Test_helloworld
 (JNIEnv *env, jobject obj, jstring string){
  const char* str = (*env)->GetStringUTFChars(env,string,0);
  char cap[128];
  cap[0] = 'h';
  cap[1] = 'e';
  cap[2] = 'l';
  cap[3] = 'l';
  cap[4] = 'o';
    
  strcat(cap,str);
    
  (*env)->ReleaseStringUTFChars(env,string,0);
  return (*env)->NewStringUTF(env,cap);
 }

备注:

1、由于Java本身使用了双字节字符,C语言本身都是单字节字符,所以需要使用(*env)->GetStringUTFChars()转换Java和C之间的字符串;

2、GetStringUTFChars()和NewStringUTF(),第一个是从UTF8转换为C的编码格式,第二个是根据C的字符串返回一个UTF8字符串;

3、ReleaseStringUTFChars()是用来释放对象的,在Java中有虚拟机进行垃圾回收,但是在C语言中这些对象必须手动回收,否则可能造成内存泄漏。

V. 编译和运行

编译:

进入cmd输入命令 > gcc -I "D:\Program Files\Java\jdk1.8.0_45\include" -I "D:\Program Files\Java\jdk1.8.0_45\include\win32" --share Test2.c -o Test2.dll

运行:

进入cmd输入命令 > java Test

运行结果如下:

helloworld

3. 总结:

第一步:编写带有native方法的Java类(Test.java),使用javac工具编译Java类(生成Test.class);

第二步:使用javah生成与native方法对应的头文件(Test.h);

第三步:使用C/C++实现相应的头文件(Test2.c),并编译为动态链接库(Test2.so)。

本文运行环境:Windows 64位操作系统,JDK 1.8版本,mingw64(GCC)

分享到:
评论

相关推荐

    android JNI学习三实例

    在这个"android JNI学习三实例"中,我们将深入探讨如何在Android应用开发中使用JNI。 一、JNI简介 JNI是Java平台的一部分,提供了一套接口,让Java代码能够调用本地(native)代码,同时也允许本地代码调用Java对象...

    第一个JNI实例学习

    在这个"第一个JNI实例学习"中,我们将探讨如何创建并运行一个基本的JNI程序。 首先,我们需要理解JNI的核心概念。JNI提供了一套接口,让Java代码能够声明本地方法,这些方法在运行时由本地(非Java)代码实现。本地...

    java jni简单实例

    本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...

    Jni完整实例

    通过这个“Jni完整实例”,你可以学习到以下关键知识点: 1. JNI接口设计:如何在Java中声明本地方法,以及在C/C++中实现这些方法。 2. NDK环境配置:Eclipse的NDK插件设置,以及NDK-build的使用。 3. 项目结构:...

    Android jni 编程实例

    在这个"Android jni 编程实例"中,我们将探讨如何在Android Studio环境下进行JNI开发,通过一个简单的入门demo来学习这个过程。 首先,我们需要了解JNI的基本概念。JNI是Java平台提供的一种接口,它允许Java代码...

    jni教程实例手把手

    在这个“jni教程实例手把手”资源中,包含了多个文档和一个示例项目,旨在帮助学习者全面理解并掌握JNI的使用。 1. **Android_JNI总结.doc**:这份文档可能是对Android平台上JNI应用的总结,涵盖了JNI的基本概念、...

    android JNI学习四实例

    Android JNI(Java Native Interface)是...通过学习这些实例,你可以掌握JNI的基本用法,包括调用本地方法、数据类型转换、回调以及文件操作等。这些知识对于开发高性能的Android应用或利用现有C/C++库至关重要。

    jni实例 已Eclipse测试可用

    开发者可以下载这个压缩包,参考其中的代码,学习如何在实际项目中应用JNI技术。通过这种方式,不仅可以提升Android应用的性能,还能利用C/C++的丰富库和强大的编程能力,解决Java无法高效处理的问题。

    Java再说JNI之实例

    Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。...通过学习这些实例,开发者可以进一步提升在Java中使用JNI的能力,解决特定问题并提升程序性能。

    Android JNI应用实例

    在"Android JNI应用实例"中,我们可以深入学习如何使用JNI。通常,一个简单的JNI开发流程包括以下步骤: 1. 创建Java类:首先,我们需要在Java层定义一个类,声明native方法,这些方法将在C/C++代码中实现。 2. ...

    JNI实例

    这篇博客文章“JNI实例”可能详细介绍了如何在实际项目中应用JNI。 在Java中,JNI提供了接口让Java代码能够调用本地(native)代码,本地代码可以是用C、C++或者其他支持的语言编写。这个过程包括以下几个关键步骤...

    CarDVR jni使用实例

    学习这个实例,开发者可以更好地理解JNI的工作机制,掌握如何在实际项目中使用JNI进行跨语言交互,这对于开发如嵌入式系统、Android应用或者需要高性能计算的Java应用等有很大帮助。通过实践,你将能够灵活运用JNI来...

    Android Studio JNI编程入门实例

    JNI(Java Native Interface...同时,CMakeLists.txt作为现代的构建系统,提供了更多高级功能,如自动依赖检测、跨平台支持等,也值得学习掌握。不断深入理解JNI,可以让你在Android开发中游刃有余,解决各种复杂问题。

    android_JNI学习一实例

    在这个实例中,我们将深入理解JNI的工作原理,并通过实际操作来学习如何在Android项目中使用JNI。 首先,我们需要了解JNI的基本概念。JNI是一种接口,让Java应用程序能够调用本地方法(即非Java语言编写的方法)。...

    Java jni调用c实例

    Java JNI(Java Native Interface)是Java平台...这个实例展示了Java和C/C++之间的交互,是学习和理解JNI机制的一个基础示例。通过掌握JNI,开发者可以充分利用两种语言的优点,如Java的跨平台性和C/C++的高效性能。

    JNI学习资料-有图有真相

    通过阅读提供的"JNI学习资料-有图有真相.doc"文档,你可以更深入地了解这些概念,并通过实例学习如何实际应用JNI。文档中的图形和示例将有助于直观理解复杂的概念,从而提升你的JNI开发技能。记得在实践过程中,不断...

    jni学习例子 在linux下执行成功

    在本示例中,我们看到的是一个JNI的学习实践,它在Linux环境下成功地执行了。这个例子展示了如何通过Java调用本地(C/C++)代码,并且提供了完整的流程,包括从Java类型转换为C类型,特别是将`jstring`转化为`char`...

    Android Jni调用实例

    在Android Jni调用实例中,我们通常会经历以下几个步骤: 1. **创建本地方法声明**:在Java层,我们需要声明一个native方法,该方法将在C/C++代码中实现。例如: ```java public class NativeDemo { static { ...

    Android JNI应用实例02

    Android JNI(Java Native Interface)是Android开发中的一个重要概念,它为Java代码提供了与本地C/C++代码交互的能力。...通过学习这个实例,开发者可以加深对Android JNI的理解,提高在实际项目中应用JNI的能力。

    JNI学习(三)之实例分析

    在本实例分析中,我们将深入理解JNI的工作原理,并通过一个具体的例子来演示如何使用JNI进行开发。这个实例可能涉及以下几个关键知识点: 1. **JNI基础知识**:JNI是一个接口,它定义了Java虚拟机(JVM)与本地代码...

Global site tag (gtag.js) - Google Analytics