原文转: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、加载动态类库: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、函数声明,固定格式:JNIEXPORT;返回类型:jstring;JNI调用:JNICALL;Java_完整类名_方法名:Java_Test_helloworld;
2、函数参数:调用jni.h封装好的函数指针:JNIEnv;Java类本身:jobject,Java文件传入参数:jstring。
IV. 编写C语言文件Test2.c实现Test类调用动态链接库的功能:
备注:
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。 一、JNI简介 JNI是Java平台的一部分,提供了一套接口,让Java代码能够调用本地(native)代码,同时也允许本地代码调用Java对象...
在这个"第一个JNI实例学习"中,我们将探讨如何创建并运行一个基本的JNI程序。 首先,我们需要理解JNI的核心概念。JNI提供了一套接口,让Java代码能够声明本地方法,这些方法在运行时由本地(非Java)代码实现。本地...
本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...
通过这个“Jni完整实例”,你可以学习到以下关键知识点: 1. JNI接口设计:如何在Java中声明本地方法,以及在C/C++中实现这些方法。 2. NDK环境配置:Eclipse的NDK插件设置,以及NDK-build的使用。 3. 项目结构:...
在这个"Android jni 编程实例"中,我们将探讨如何在Android Studio环境下进行JNI开发,通过一个简单的入门demo来学习这个过程。 首先,我们需要了解JNI的基本概念。JNI是Java平台提供的一种接口,它允许Java代码...
在这个“jni教程实例手把手”资源中,包含了多个文档和一个示例项目,旨在帮助学习者全面理解并掌握JNI的使用。 1. **Android_JNI总结.doc**:这份文档可能是对Android平台上JNI应用的总结,涵盖了JNI的基本概念、...
Android JNI(Java Native Interface)是...通过学习这些实例,你可以掌握JNI的基本用法,包括调用本地方法、数据类型转换、回调以及文件操作等。这些知识对于开发高性能的Android应用或利用现有C/C++库至关重要。
开发者可以下载这个压缩包,参考其中的代码,学习如何在实际项目中应用JNI技术。通过这种方式,不仅可以提升Android应用的性能,还能利用C/C++的丰富库和强大的编程能力,解决Java无法高效处理的问题。
Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。...通过学习这些实例,开发者可以进一步提升在Java中使用JNI的能力,解决特定问题并提升程序性能。
在"Android JNI应用实例"中,我们可以深入学习如何使用JNI。通常,一个简单的JNI开发流程包括以下步骤: 1. 创建Java类:首先,我们需要在Java层定义一个类,声明native方法,这些方法将在C/C++代码中实现。 2. ...
这篇博客文章“JNI实例”可能详细介绍了如何在实际项目中应用JNI。 在Java中,JNI提供了接口让Java代码能够调用本地(native)代码,本地代码可以是用C、C++或者其他支持的语言编写。这个过程包括以下几个关键步骤...
学习这个实例,开发者可以更好地理解JNI的工作机制,掌握如何在实际项目中使用JNI进行跨语言交互,这对于开发如嵌入式系统、Android应用或者需要高性能计算的Java应用等有很大帮助。通过实践,你将能够灵活运用JNI来...
JNI(Java Native Interface...同时,CMakeLists.txt作为现代的构建系统,提供了更多高级功能,如自动依赖检测、跨平台支持等,也值得学习掌握。不断深入理解JNI,可以让你在Android开发中游刃有余,解决各种复杂问题。
在这个实例中,我们将深入理解JNI的工作原理,并通过实际操作来学习如何在Android项目中使用JNI。 首先,我们需要了解JNI的基本概念。JNI是一种接口,让Java应用程序能够调用本地方法(即非Java语言编写的方法)。...
Java JNI(Java Native Interface)是Java平台...这个实例展示了Java和C/C++之间的交互,是学习和理解JNI机制的一个基础示例。通过掌握JNI,开发者可以充分利用两种语言的优点,如Java的跨平台性和C/C++的高效性能。
通过阅读提供的"JNI学习资料-有图有真相.doc"文档,你可以更深入地了解这些概念,并通过实例学习如何实际应用JNI。文档中的图形和示例将有助于直观理解复杂的概念,从而提升你的JNI开发技能。记得在实践过程中,不断...
在本示例中,我们看到的是一个JNI的学习实践,它在Linux环境下成功地执行了。这个例子展示了如何通过Java调用本地(C/C++)代码,并且提供了完整的流程,包括从Java类型转换为C类型,特别是将`jstring`转化为`char`...
在Android Jni调用实例中,我们通常会经历以下几个步骤: 1. **创建本地方法声明**:在Java层,我们需要声明一个native方法,该方法将在C/C++代码中实现。例如: ```java public class NativeDemo { static { ...
Android JNI(Java Native Interface)是Android开发中的一个重要概念,它为Java代码提供了与本地C/C++代码交互的能力。...通过学习这个实例,开发者可以加深对Android JNI的理解,提高在实际项目中应用JNI的能力。
在本实例分析中,我们将深入理解JNI的工作原理,并通过一个具体的例子来演示如何使用JNI进行开发。这个实例可能涉及以下几个关键知识点: 1. **JNI基础知识**:JNI是一个接口,它定义了Java虚拟机(JVM)与本地代码...