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

群:120648059  Android NDK开发交流
验证 :  163

ScanResult.java 文件

Java代码    收藏代码
  1. package com.ldq;  
  2.   
  3. public class ScanResult {  
  4.   
  5.     String ssid;  
  6.     String mac;  
  7.     int level;  
  8.   
  9.     ScanResult() {  
  10.     }  
  11.   
  12. }  

WifiManager.java 文件

Java代码    收藏代码
  1. package com.ldq;  
  2.   
  3. public class WifiManager {  
  4.     static {  
  5.         System.loadLibrary("wifi");  
  6.     }  
  7.   
  8.     public native static String test();  
  9.   
  10.     public native static ScanResult getScanResult();  
  11.   
  12. }  

 Test.java 文件

Java代码    收藏代码
  1. package com.ldq;  
  2.   
  3. public class Test {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         // TODO Auto-generated method stub  
  10.         System.out.println(WifiManager.test());  
  11.         System.out.println(WifiManager.getScanResult().ssid);  
  12.         System.out.println(WifiManager.getScanResult().mac);  
  13.         System.out.println(WifiManager.getScanResult().level);  
  14.     }  
  15.   
  16. }  
  • javah -jni com.ldq.WifiManager 生成头文件 com_ldq_WifiManager.h

com_ldq_WifiManager.h 文件

Cpp代码    收藏代码
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_ldq_WifiManager */  
  4.   
  5. #ifndef _Included_com_ldq_WifiManager  
  6. #define _Included_com_ldq_WifiManager  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     com_ldq_WifiManager 
  12.  * Method:    test 
  13.  * Signature: ()Ljava/lang/String; 
  14.  */  
  15. JNIEXPORT jstring JNICALL Java_com_ldq_WifiManager_test  
  16.   (JNIEnv *, jclass);  
  17.   
  18. /* 
  19.  * Class:     com_ldq_WifiManager 
  20.  * Method:    getScanResult 
  21.  * Signature: ()Lcom/ldq/ScanResult; 
  22.  */  
  23. JNIEXPORT jobject JNICALL Java_com_ldq_WifiManager_getScanResult  
  24.   (JNIEnv *, jclass);  
  25.   
  26. #ifdef __cplusplus  
  27. }  
  28. #endif  
  29. #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 文件

Cpp代码    收藏代码
  1. #include "com_ldq_WifiManager.h"  
  2.   
  3. /* 
  4.  * Class:     com_ldq_WifiManager 
  5.  * Method:    test 
  6.  * Signature: ()Ljava/lang/String; 
  7.  */  
  8. JNIEXPORT jstring JNICALL Java_com_ldq_WifiManager_test (JNIEnv *env, jclass cls)  
  9. {  
  10.     return env->NewStringUTF("Hello");  
  11. }  
  12.   
  13. /* 
  14.  * Class:     com_ldq_WifiManager 
  15.  * Method:    getScanResult 
  16.  * Signature: ()Lcom/ldq/ScanResult; 
  17.  */  
  18. JNIEXPORT jobject JNICALL Java_com_ldq_WifiManager_getScanResult (JNIEnv *env, jclass cls)  
  19. {  
  20.     jclass    m_cls   = env->FindClass("com/ldq/ScanResult");  
  21.   
  22.     jmethodID m_mid   = env->GetMethodID(m_cls,"<init>","()V");  
  23.       
  24.     jfieldID  m_fid_1 = env->GetFieldID(m_cls,"ssid","Ljava/lang/String;");  
  25.     jfieldID  m_fid_2 = env->GetFieldID(m_cls,"mac","Ljava/lang/String;");  
  26.     jfieldID  m_fid_3 = env->GetFieldID(m_cls,"level","I");  
  27.   
  28.     jobject   m_obj   = env->NewObject(m_cls,m_mid);  
  29.   
  30.                         env->SetObjectField(m_obj,m_fid_1,env->NewStringUTF("AP1"));  
  31.                         env->SetObjectField(m_obj,m_fid_2,env->NewStringUTF("00-11-22-33-44-55"));  
  32.                         env->SetIntField(m_obj,m_fid_3,-50);  
  33.     return m_obj;  
  34. }  
  • 上述文件中的代码是重点
    • 首先获得类文件,名字为 "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 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值