JNI (JAVA Native Interface) 是 Java 与 C 的桥梁,有些时候要用到 JNI :
•访问底层硬件
•提高代码运行效率
简单的整型数据传递
•首先添加环境变量:
◦jni.h include=C:\Program Files\Java\jdk1.6.0_13\include
◦jni_md.h include=C:\Program Files\Java\jdk1.6.0_13\include\win32
•用 eclipse 编写 Java 代码:D_int.java
Java代码
1.package com.ldq.d_int;
2.
3.public class D_int {
4. static {
5. System.loadLibrary("Factorial");
6. }
7.
8. public native long getFactorial(int num);
9.
10. public static void main(String[] args) {
11. D_int d = new D_int();
12. int num = 10;
13. System.out.println(num + "!=" + d.getFactorial(num));
14. }
15.
16.}
package com.ldq.d_int;
public class D_int {
static {
System.loadLibrary("Factorial");
}
public native long getFactorial(int num);
public static void main(String[] args) {
D_int d = new D_int();
int num = 10;
System.out.println(num + "!=" + d.getFactorial(num));
}
}
•在 bin 目录下,生成头文件 com_ldq_d_int_D_int.h:javah -jni com.ldq.d_int.D_int
C代码
1./* DO NOT EDIT THIS FILE - it is machine generated */
2.#include <jni.h>
3./* Header for class com_ldq_d_int_D_int */
4.
5.#ifndef _Included_com_ldq_d_int_D_int
6.#define _Included_com_ldq_d_int_D_int
7.#ifdef __cplusplus
8.extern "C" {
9.#endif
10./*
11. * Class: com_ldq_d_int_D_int
12. * Method: getFactorial
13. * Signature: (I)J
14. */
15.JNIEXPORT jlong JNICALL Java_com_ldq_d_1int_D_1int_getFactorial
16. (JNIEnv *, jobject, jint);
17.
18.#ifdef __cplusplus
19.}
20.#endif
21.#endif
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ldq_d_int_D_int */
#ifndef _Included_com_ldq_d_int_D_int
#define _Included_com_ldq_d_int_D_int
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ldq_d_int_D_int
* Method: getFactorial
* Signature: (I)J
*/
JNIEXPORT jlong JNICALL Java_com_ldq_d_1int_D_1int_getFactorial
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
•在 bin 目录下新建 Factorial.cpp 文件,并根据上面函数定义,编写代码:
Cpp代码
1.#include "com_ldq_d_int_D_int.h"
2.
3.JNIEXPORT jlong JNICALL Java_com_ldq_d_1int_D_1int_getFactorial (JNIEnv *env, jobject obj, jint num)
4.{
5. int f=1;
6. for(int i=1;i<num+1;i++)
7. {
8. f*=i;
9. }
10. return f;
11.}
分享到:
相关推荐
要从JNI返回这样的自定义对象,我们需要在JNI层创建一个对应的C++类,并实现相同的功能。这个C++类需要包含对应的成员变量和方法。例如: ```cpp #include <jni.h> #include struct MyCustomObject { int id; ...
Java Native Interface(JNI)是Java平台的标准组成部分,它允许...这就是一个简单的JNI返回对象数组的例子。通过这种方式,我们可以灵活地在Java和本地代码之间传递复杂的数据结构,极大地扩展了Java应用程序的能力。
总的来说,JNI提供了强大的能力,让我们能够在Java和原生代码之间灵活地传递数据,包括对象数组。在实际开发中,理解JNI的工作原理和正确管理内存至关重要,以避免可能出现的内存泄漏和异常。同时,需要注意的是,...
总结来说,通过JNI将Java对象传递到C代码,需要理解JNI的API,正确处理Java对象的生命周期,并确保在C代码中安全地操作这些对象。这既是一个挑战,也是提升程序性能和功能的重要手段。在实际开发中,应充分考虑跨...
本篇文章将深入探讨在Android Studio中使用JNI的函数以及如何传递复杂对象。 首先,JNI的核心是通过`JNIEnv`指针来访问Java对象和方法。`JNIEnv`是一个结构体指针,包含了调用Java方法、创建Java对象等一系列接口。...
本“JNI数据传递demo”旨在演示如何在C/C++与Java之间传递基本数据类型、数组以及对象。 1. **基本数据类型传递**: JNI提供了对Java基本数据类型的映射,例如`jboolean`, `jbyte`, `jchar`, `jshort`, ` jint`, `...
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
JNI支持通过指针间接调用Java方法,这通常涉及到对象和方法的查找、参数传递以及结果返回等步骤。 ##### 4.3 处理数组和字符串 JNI提供了专门的API来处理数组和字符串,包括读取、修改和释放资源等功能。例如,...
JNI层传递数据是一个关键的环节,尤其是在处理复杂数据结构时,如内部类对象和多层结构体嵌套。这种场景在系统优化、性能提升或使用第三方库时经常遇到。 首先,让我们详细了解一下JNI如何处理Java内部类对象。在...
综上所述,JNI类的传递涉及到类的查找、对象的转换、方法和字段的调用,以及异常和内存管理等多个方面。熟练掌握这些知识点,能帮助开发者更高效地在Java和Native层之间进行数据交换和逻辑处理。
`jni数据处理.txt`可能涉及不同类型的数据转换,如整型、浮点型和数组的处理。 总的来说,JNI提供了一种强大但复杂的机制,使得Java代码可以利用本地代码的能力。然而,由于其涉及到多层抽象的交互,因此需要谨慎...
3. **数据传递** - `JNIEnv`接口:这是JNI的核心,提供了一系列的函数,用于在Java和C/C++之间创建对象、调用方法、访问字段等。 - `局部引用`和`全局引用`:管理Java对象的生命周期。局部引用在JNI函数返回后自动...
JNI头文件`jni.h`提供了在本地代码中操作Java对象和数据的接口。 1. **创建和访问Java数组** 在Java中,你可以声明一个简单的类型数组,例如`int[]`或`float[]`。要在本地代码中访问这些数组,你需要先获取`JNIEnv...
2. **使用自定义对象返回复杂数据**: 对于更复杂的结构,可设计一个包含`bytearray`字段的Java类,如`RetObj`,并在C/C++侧填充该字段,再将整个对象返回给Java。 #### 示例:Java数组到C/C++数组的转换 1. **...
5. **处理图像数据**: 将Java中的图像数据传递给JNI接口,进行人脸检测,并将结果返回给Java层。 6. **显示结果**: 在Java应用中,根据返回的人脸检测结果进行图像标注或进一步处理。 通过这个项目,开发者可以学习...
在本示例中,我们关注的是如何在JNI中使用`jobjectArray`来处理Java对象数组。 `jobjectArray`是JNI中的一个类型,它代表了Java世界中的对象数组。使用`jobjectArray`,我们可以从本地代码创建、访问和修改Java对象...
- 这个C源码会包含JNI接口,这些接口允许C代码与Java对象和数据类型交互,如获取Java数组中的元素,设置返回值等。 3. **编译C代码**: - 使用GCC或者其他C编译器,结合JNI库(通常在Java SDK的`lib`目录下)编译...
通过JNI,Java Activity可以将数据传递给本地代码,然后本地代码处理后再返回结果。 2. **JSON序列化与反序列化**: 在Java中,我们可以使用诸如Gson、Jackson或org.json等库将Java对象序列化为JSON字符串,也可以...
- **JNI传递返回值**:详细讲解了如何在JNI中传递和返回各种类型的数据,包括基本类型、字符串、数组等。 - **传递字符串**:介绍了在JNI中如何安全有效地处理字符串传递。 - **传递整型数组**:探讨了整型数组在...
在JNI中,我们可以使用C++或C语言编写本地方法,这些本地方法可以直接访问和操作Java对象,包括传递参数和接收返回值。在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java...