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.h 和 jni_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 对应的工程文件根目录下,此处为
- Eclipse 下运行,结果为
运行结果
Hello
AP1
00-11-22-33-44-55
-50
分享到:
相关推荐
Java Native Interface(JNI)是Java平台的标准组成部分,它允许...这就是一个简单的JNI返回对象数组的例子。通过这种方式,我们可以灵活地在Java和本地代码之间传递复杂的数据结构,极大地扩展了Java应用程序的能力。
要从JNI返回这样的自定义对象,我们需要在JNI层创建一个对应的C++类,并实现相同的功能。这个C++类需要包含对应的成员变量和方法。例如: ```cpp #include <jni.h> #include struct MyCustomObject { int id; ...
总的来说,JNI提供了强大的能力,让我们能够在Java和原生代码之间灵活地传递数据,包括对象数组。在实际开发中,理解JNI的工作原理和正确管理内存至关重要,以避免可能出现的内存泄漏和异常。同时,需要注意的是,...
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
本“JNI数据传递demo”旨在演示如何在C/C++与Java之间传递基本数据类型、数组以及对象。 1. **基本数据类型传递**: JNI提供了对Java基本数据类型的映射,例如`jboolean`, `jbyte`, `jchar`, `jshort`, ` jint`, `...
总结来说,通过JNI将Java对象传递到C代码,需要理解JNI的API,正确处理Java对象的生命周期,并确保在C代码中安全地操作这些对象。这既是一个挑战,也是提升程序性能和功能的重要手段。在实际开发中,应充分考虑跨...
本篇文章将深入探讨在Android Studio中使用JNI的函数以及如何传递复杂对象。 首先,JNI的核心是通过`JNIEnv`指针来访问Java对象和方法。`JNIEnv`是一个结构体指针,包含了调用Java方法、创建Java对象等一系列接口。...
`jni数据处理.txt`可能涉及不同类型的数据转换,如整型、浮点型和数组的处理。 总的来说,JNI提供了一种强大但复杂的机制,使得Java代码可以利用本地代码的能力。然而,由于其涉及到多层抽象的交互,因此需要谨慎...
JNI层传递数据是一个关键的环节,尤其是在处理复杂数据结构时,如内部类对象和多层结构体嵌套。这种场景在系统优化、性能提升或使用第三方库时经常遇到。 首先,让我们详细了解一下JNI如何处理Java内部类对象。在...
综上所述,JNI类的传递涉及到类的查找、对象的转换、方法和字段的调用,以及异常和内存管理等多个方面。熟练掌握这些知识点,能帮助开发者更高效地在Java和Native层之间进行数据交换和逻辑处理。
3. **数据传递** - `JNIEnv`接口:这是JNI的核心,提供了一系列的函数,用于在Java和C/C++之间创建对象、调用方法、访问字段等。 - `局部引用`和`全局引用`:管理Java对象的生命周期。局部引用在JNI函数返回后自动...
通过JNI,Java Activity可以将数据传递给本地代码,然后本地代码处理后再返回结果。 2. **JSON序列化与反序列化**: 在Java中,我们可以使用诸如Gson、Jackson或org.json等库将Java对象序列化为JSON字符串,也可以...
2. **使用自定义对象返回复杂数据**: 对于更复杂的结构,可设计一个包含`bytearray`字段的Java类,如`RetObj`,并在C/C++侧填充该字段,再将整个对象返回给Java。 #### 示例:Java数组到C/C++数组的转换 1. **...
在本示例中,我们关注的是如何在JNI中使用`jobjectArray`来处理Java对象数组。 `jobjectArray`是JNI中的一个类型,它代表了Java世界中的对象数组。使用`jobjectArray`,我们可以从本地代码创建、访问和修改Java对象...
在JNI中,我们可以使用C++或C语言编写本地方法,这些本地方法可以直接访问和操作Java对象,包括传递参数和接收返回值。在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java...
在JNI中,参数传递是一个关键的概念,因为它涉及到Java方法调用本地方法时的数据交换。 1. **JNI基础知识** JNI接口定义了一系列的函数,这些函数提供了在Java和本地代码之间创建桥梁的能力。Java虚拟机(JVM)...
JNI头文件`jni.h`提供了在本地代码中操作Java对象和数据的接口。 1. **创建和访问Java数组** 在Java中,你可以声明一个简单的类型数组,例如`int[]`或`float[]`。要在本地代码中访问这些数组,你需要先获取`JNIEnv...
可以使用JNIEnv指针来访问Java对象和数组,将Java层的Buffer或ByteBuffer传递到C/C++层,进行处理后再返回。 4. **多线程处理**:音视频处理通常涉及复杂的计算,因此在C/C++层使用多线程优化处理效率。同时,需要...
Java Native Access (JNA) 是一个非常实用的框架,它允许Java程序直接调用本地(Native)代码,无需编写JNI(Java Native Interface)代码。本案例将详细介绍如何使用JNA来调用C++动态库,特别是处理二维数组的输入和...
在JNI中,你也可以传递自定义数据结构。`teststruct`可能是C++中的结构体定义,而`JavaGetCstruct`可能是一个Java方法,用于获取并处理这些结构体数据。C++结构体可以通过`NewDirectByteBuffer`或`SetStructField`等...