`
高级java工程师
  • 浏览: 405343 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JNI -返回对象 -对象数据传递(三)

阅读更多
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.} 
分享到:
评论

相关推荐

    Android调用Jni返回自定义对象

    要从JNI返回这样的自定义对象,我们需要在JNI层创建一个对应的C++类,并实现相同的功能。这个C++类需要包含对应的成员变量和方法。例如: ```cpp #include &lt;jni.h&gt; #include struct MyCustomObject { int id; ...

    jni返回对象数组例子

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

    jni传递对象数组

    总的来说,JNI提供了强大的能力,让我们能够在Java和原生代码之间灵活地传递数据,包括对象数组。在实际开发中,理解JNI的工作原理和正确管理内存至关重要,以避免可能出现的内存泄漏和异常。同时,需要注意的是,...

    jni java传递对象到C

    总结来说,通过JNI将Java对象传递到C代码,需要理解JNI的API,正确处理Java对象的生命周期,并确保在C代码中安全地操作这些对象。这既是一个挑战,也是提升程序性能和功能的重要手段。在实际开发中,应充分考虑跨...

    jni数据传递demo

    本“JNI数据传递demo”旨在演示如何在C/C++与Java之间传递基本数据类型、数组以及对象。 1. **基本数据类型传递**: JNI提供了对Java基本数据类型的映射,例如`jboolean`, `jbyte`, `jchar`, `jshort`, ` jint`, `...

    Android studio JNI函数以及复杂对象传递

    本篇文章将深入探讨在Android Studio中使用JNI的函数以及如何传递复杂对象。 首先,JNI的核心是通过`JNIEnv`指针来访问Java对象和方法。`JNIEnv`是一个结构体指针,包含了调用Java方法、创建Java对象等一系列接口。...

    JNI与C++数据类型传递示例(包括ArrayList对象、ArrayList嵌套返回)

    一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList&lt;ArrayList&lt;String&gt;&gt;等。

    JNI-API详细说明

    JNI支持通过指针间接调用Java方法,这通常涉及到对象和方法的查找、参数传递以及结果返回等步骤。 ##### 4.3 处理数组和字符串 JNI提供了专门的API来处理数组和字符串,包括读取、修改和释放资源等功能。例如,...

    JNI层传递数据

    JNI层传递数据是一个关键的环节,尤其是在处理复杂数据结构时,如内部类对象和多层结构体嵌套。这种场景在系统优化、性能提升或使用第三方库时经常遇到。 首先,让我们详细了解一下JNI如何处理Java内部类对象。在...

    JNI实战一:向Native层传递一个类,并从Native层返回一个类

    综上所述,JNI类的传递涉及到类的查找、对象的转换、方法和字段的调用,以及异常和内存管理等多个方面。熟练掌握这些知识点,能帮助开发者更高效地在Java和Native层之间进行数据交换和逻辑处理。

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

    `jni数据处理.txt`可能涉及不同类型的数据转换,如整型、浮点型和数组的处理。 总的来说,JNI提供了一种强大但复杂的机制,使得Java代码可以利用本地代码的能力。然而,由于其涉及到多层抽象的交互,因此需要谨慎...

    androidjni编程,java和c层的互相通信传递数据

    3. **数据传递** - `JNIEnv`接口:这是JNI的核心,提供了一系列的函数,用于在Java和C/C++之间创建对象、调用方法、访问字段等。 - `局部引用`和`全局引用`:管理Java对象的生命周期。局部引用在JNI函数返回后自动...

    JNI学习三-简单类型数组访问

    JNI头文件`jni.h`提供了在本地代码中操作Java对象和数据的接口。 1. **创建和访问Java数组** 在Java中,你可以声明一个简单的类型数组,例如`int[]`或`float[]`。要在本地代码中访问这些数组,你需要先获取`JNIEnv...

    jni数据类型转换

    2. **使用自定义对象返回复杂数据**: 对于更复杂的结构,可设计一个包含`bytearray`字段的Java类,如`RetObj`,并在C/C++侧填充该字段,再将整个对象返回给Java。 #### 示例:Java数组到C/C++数组的转换 1. **...

    JNI-OpenCV-Face-Detection:JNI OpenCV 人脸检测

    5. **处理图像数据**: 将Java中的图像数据传递给JNI接口,进行人脸检测,并将结果返回给Java层。 6. **显示结果**: 在Java应用中,根据返回的人脸检测结果进行图像标注或进一步处理。 通过这个项目,开发者可以学习...

    android jni 使用object对象

    在本示例中,我们关注的是如何在JNI中使用`jobjectArray`来处理Java对象数组。 `jobjectArray`是JNI中的一个类型,它代表了Java世界中的对象数组。使用`jobjectArray`,我们可以从本地代码创建、访问和修改Java对象...

    linux-java调用c语言编译的so动态库-jni例子-简单计算器

    - 这个C源码会包含JNI接口,这些接口允许C代码与Java对象和数据类型交互,如获取Java数组中的元素,设置返回值等。 3. **编译C代码**: - 使用GCC或者其他C编译器,结合JNI库(通常在Java SDK的`lib`目录下)编译...

    java传送json到jni,jni传送json到java

    通过JNI,Java Activity可以将数据传递给本地代码,然后本地代码处理后再返回结果。 2. **JSON序列化与反序列化**: 在Java中,我们可以使用诸如Gson、Jackson或org.json等库将Java对象序列化为JSON字符串,也可以...

    网上整理的JNI教程

    - **JNI传递返回值**:详细讲解了如何在JNI中传递和返回各种类型的数据,包括基本类型、字符串、数组等。 - **传递字符串**:介绍了在JNI中如何安全有效地处理字符串传递。 - **传递整型数组**:探讨了整型数组在...

    Jni中C++和Java的参数传递

    在JNI中,我们可以使用C++或C语言编写本地方法,这些本地方法可以直接访问和操作Java对象,包括传递参数和接收返回值。在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java...

Global site tag (gtag.js) - Google Analytics