`
leidiqiu
  • 浏览: 135121 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • JNI
阅读更多
  • Eclipse 新建工程 ExWifi

ScanResult.java 文件

package com.ldq;

public class ScanResult {

	String ssid;
	String mac;
	int level;

	ScanResult() {
	}

}

WifiManager.java 文件

package com.ldq;

public class WifiManager {
	static {
		System.loadLibrary("wifi");
	}

	public native static String test();

	public native static ScanResult getScanResult();

}

 Test.java 文件

package com.ldq;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(WifiManager.test());
		System.out.println(WifiManager.getScanResult().ssid);
		System.out.println(WifiManager.getScanResult().mac);
		System.out.println(WifiManager.getScanResult().level);
	}

}
  • javah -jni com.ldq.WifiManager 生成头文件 com_ldq_WifiManager.h

com_ldq_WifiManager.h 文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ldq_WifiManager */

#ifndef _Included_com_ldq_WifiManager
#define _Included_com_ldq_WifiManager
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ldq_WifiManager
 * Method:    test
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_ldq_WifiManager_test
  (JNIEnv *, jclass);

/*
 * Class:     com_ldq_WifiManager
 * Method:    getScanResult
 * Signature: ()Lcom/ldq/ScanResult;
 */
JNIEXPORT jobject JNICALL Java_com_ldq_WifiManager_getScanResult
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif
  • VC++6.0中新建工程 wifi ,选 Win32 Dynamic-Link Library 方式
  • Tools - Options - Directories - Include files 加入 jni.hjni_md.h 的路径,此处为
    • C:\Program Files\Java\jdk1.6.0_13\include
    • C:\Program Files\Java\jdk1.6.0_13\include\win32
  • 新建 wifi.cpp 文件

wifi.cpp 文件

#include "com_ldq_WifiManager.h"

/*
 * Class:     com_ldq_WifiManager
 * Method:    test
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_ldq_WifiManager_test (JNIEnv *env, jclass cls)
{
	return env->NewStringUTF("Hello");
}

/*
 * Class:     com_ldq_WifiManager
 * Method:    getScanResult
 * Signature: ()Lcom/ldq/ScanResult;
 */
JNIEXPORT jobject JNICALL Java_com_ldq_WifiManager_getScanResult (JNIEnv *env, jclass cls)
{
	jclass    m_cls   = env->FindClass("com/ldq/ScanResult");

	jmethodID m_mid   = env->GetMethodID(m_cls,"<init>","()V");
	
	jfieldID  m_fid_1 = env->GetFieldID(m_cls,"ssid","Ljava/lang/String;");
	jfieldID  m_fid_2 = env->GetFieldID(m_cls,"mac","Ljava/lang/String;");
	jfieldID  m_fid_3 = env->GetFieldID(m_cls,"level","I");

	jobject   m_obj   = env->NewObject(m_cls,m_mid);

	                    env->SetObjectField(m_obj,m_fid_1,env->NewStringUTF("AP1"));
						env->SetObjectField(m_obj,m_fid_2,env->NewStringUTF("00-11-22-33-44-55"));
						env->SetIntField(m_obj,m_fid_3,-50);
	return m_obj;
}
  • 上述文件中的代码是重点
    • 首先获得类文件,名字为 "com/ldq/ScanResult" ,不同于Java自身的文件,如 "Ljava/lang/String",前面多了个 "L" ,个人理解为 Local 的意思,意为本地库
    • 再获得构造函数,注意格式,和一般的引用类的方法不同,名字为 "<init>" 类型为 "()V" ,本人在此处耗费了很长时间
    • 获得类的各个成员变量域,方便后续引用
    • 生成对象,由于参数为空,所以 NewObject 函数只有两个参数
    • 设定对象的各个成员变量
    • 返回对象
  • 编译,将生成的 wifi.dll 文件拷贝到 Eclipse 对应的工程文件根目录下,此处为
    • D:\workspace_java\ExWifi
  • Eclipse 下运行,结果为
运行结果
Hello
AP1
00-11-22-33-44-55
-50

 

分享到:
评论

相关推荐

    jni返回对象数组例子

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

    Android调用Jni返回自定义对象

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

    jni传递对象数组

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

    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数据传递demo

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

    jni java传递对象到C

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

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

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

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

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

    JNI层传递数据

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

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

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

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

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

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

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

    jni数据类型转换

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

    android jni 使用object对象

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

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

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

    JNI的参数传递 一二

    在JNI中,参数传递是一个关键的概念,因为它涉及到Java方法调用本地方法时的数据交换。 1. **JNI基础知识** JNI接口定义了一系列的函数,这些函数提供了在Java和本地代码之间创建桥梁的能力。Java虚拟机(JVM)...

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

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

    Android平台下通过JNI快速实现音视频通信

    可以使用JNIEnv指针来访问Java对象和数组,将Java层的Buffer或ByteBuffer传递到C/C++层,进行处理后再返回。 4. **多线程处理**:音视频处理通常涉及复杂的计算,因此在C/C++层使用多线程优化处理效率。同时,需要...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    Java Native Access (JNA) 是一个非常实用的框架,它允许Java程序直接调用本地(Native)代码,无需编写JNI(Java Native Interface)代码。本案例将详细介绍如何使用JNA来调用C++动态库,特别是处理二维数组的输入和...

    jni c++ 返回一个类

    在JNI中,你也可以传递自定义数据结构。`teststruct`可能是C++中的结构体定义,而`JavaGetCstruct`可能是一个Java方法,用于获取并处理这些结构体数据。C++结构体可以通过`NewDirectByteBuffer`或`SetStructField`等...

Global site tag (gtag.js) - Google Analytics