Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3472273
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: Java

2011-03-31 22:58:39

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. }  
package com.ldq; public class ScanResult { String ssid; String mac; int level; ScanResult() { } }

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. }  
package com.ldq; public class WifiManager { static { System.loadLibrary("wifi"); } public native static String test(); public native static ScanResult getScanResult(); }

 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. }  
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 文件

Cpp代码
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include    
  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  
/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* 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 文件

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,"","()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. }  
#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,"","()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 的意思,意为本地库
    • 再获得构造函数,注意格式,和一般的引用类的方法不同,名字为 "" 类型为 "()V" ,本人在此处耗费了很长时间
    • 获得类的各个成员变量域,方便后续引用
    • 生成对象,由于参数为空,所以 NewObject 函数只有两个参数
    • 设定对象的各个成员变量
    • 返回对象
  • 编译,将生成的 wifi.dll 文件拷贝到 Eclipse 对应的工程文件根目录下,此处为
    • D:\workspace_java\ExWifi
  • Eclipse 下运行,结果为
运行结果
Hello
AP1
00-11-22-33-44-55
-50

 

google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);
阅读(927) | 评论(0) | 转发(0) |
0

上一篇:JNI 对象处理

下一篇:JNI 返回字符串数据

给主人留下些什么吧!~~