【转】JNI 对象处理
原文网址:http://leidiqiu.iteye.com/blog/720307
JNI 的基本问题就是解决 Java 和 C++ 代码互相调用的通信问题,在 C++ 代码编写过程中最大的问题莫过于适应其中的代码编写规则,C++调用或是返回的内容必须遵守 JVM 和 C++ 代码的通信规则。
C++ 调用 Java 的一般步骤如下:
- 获得类:
- jclass cls = env->FindClass("com/ldq/Student");
- cls 可认为是类的句柄
- "com/ldq/Student" 就是类文件,注意不能用 "com.ldq.Student"
- 获得方法:
- jmethodID mid = env->GetMethodID(cls,"<init>","()V");
- 以上为构造函数,参数是 "<init>" "()V"
- jmethodID mid = env->GetMethodID(cls,"getAge","()I");
- 以上为类的方法,第一个参数是类句柄,第二个参数是方法名字,第三个参数是签名标识
Java类型 |
符号 |
boolean | Z |
byte |
B |
char |
C |
short | S |
int | I |
long | L |
float | F |
double |
D |
void |
V |
objects对象 | Lfully-qualified-class-name; L类名; |
Arrays数组 | [array-type [数组类型 |
methods方法 | (argument-types)return-type(参数类型)返回类型 |
- 获得对象:
- jobject obj=env->NewObject(cls,mid);
- 以上便获得了一个对象的句柄
- 获得对象成员变量:
- jfieldID fid=env->GetFieldID(cls,"age","I");
- 以上和获得类方法差不多
- 操作成员变量:
- jint a=env->GetIntField(obj,mid);
- age=age+10;
- env->SetIntField(obj,fid,a);
- 返回:
- return obj;
下面是本人练习的例子
- ExList.java
- package com.ldq.list;
- import java.util.List;
- public class ExList {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- System.out.println("-------WifiManager.test()");
- System.out.println(WifiManager.test());
- System.out.println("-------WifiManager.testArray()");
- String[] s1 = WifiManager.testArray();
- for (int i = 0; i < s1.length; i++) {
- System.out.println(s1[i]);
- }
- System.out.println("-------WifiManager.testObject()");
- System.out.println(WifiManager.testObject().ssid);
- System.out.println(WifiManager.testObject().mac);
- System.out.println(WifiManager.testObject().level);
- System.out.println("-------WifiManager.getScanResultsA()");
- ScanResult[] s2 = WifiManager.getScanResultsA();
- for (int i = 0; i < s2.length; i++) {
- System.out.println(s2[i].ssid);
- System.out.println(s2[i].mac);
- System.out.println(s2[i].level);
- }
- System.out.println("-------WifiManager.getScanResults()");
- List<ScanResult> list = WifiManager.getScanResults();
- System.out.println(list.get(0).ssid);
- System.out.println(list.get(0).mac);
- System.out.println(list.get(0).level);
- }
- }
- ScanResult.java
- package com.ldq.list;
- public class ScanResult {
- String ssid;
- String mac;
- int level;
- public ScanResult() {
- }
- public ScanResult(String ssid, String mac, int level) {
- this.ssid = ssid;
- this.mac = mac;
- this.level = level;
- }
- }
- WifiManager.java
- package com.ldq.list;
- import java.util.List;
- public class WifiManager {
- static {
- System.loadLibrary("wifi");
- }
- public native static String test();
- public native static String[] testArray();
- public native static ScanResult testObject();
- public native static ScanResult[] getScanResultsA();
- public native static List<ScanResult> getScanResults();
- }
- wifi.cpp
- #include <jni.h>
- #include "com_ldq_list_WifiManager.h"
- /*
- * Class: com_ldq_list_WifiManager
- * Method: test
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_com_ldq_list_WifiManager_test (JNIEnv *env, jclass cls)
- {
- return env->NewStringUTF("hello");
- }
- /*
- * Class: com_ldq_list_WifiManager
- * Method: testArray
- * Signature: ()[Ljava/lang/String;
- */
- JNIEXPORT jobjectArray JNICALL Java_com_ldq_list_WifiManager_testArray (JNIEnv *env, jclass cls)
- {
- jobjectArray ret;
- int i;
- char *message[5]= {"first",
- "second",
- "third",
- "fourth",
- "fifth"};
- ret= (jobjectArray)env->NewObjectArray(5,
- env->FindClass("java/lang/String"),
- env->NewStringUTF(""));
- for(i=0;i<5;i++) {
- env->SetObjectArrayElement(
- ret,i,env->NewStringUTF(message[i]));
- }
- return(ret);
- }
- /*
- * Class: com_ldq_list_WifiManager
- * Method: testObject
- * Signature: ()Lcom/ldq/list/ScanResult;
- */
- JNIEXPORT jobject JNICALL Java_com_ldq_list_WifiManager_testObject (JNIEnv *env, jclass cls)
- {
- jclass m_cls = env->FindClass("com/ldq/list/ScanResult");
- jmethodID mid = env->GetMethodID(m_cls,"<init>","()V");
- jobject obj = env->NewObject(m_cls,mid);
- jfieldID fid_ssid = env->GetFieldID(m_cls,"ssid","Ljava/lang/String;");
- jfieldID fid_mac = env->GetFieldID(m_cls,"mac","Ljava/lang/String;");
- jfieldID fid_level = env->GetFieldID(m_cls,"level","I");
- env->SetObjectField(obj,fid_ssid,env->NewStringUTF("AP1"));
- env->SetObjectField(obj,fid_mac,env->NewStringUTF("00-11-22-33-44-55"));
- env->SetIntField(obj,fid_level,-66);
- return obj;
- }
- /*
- * Class: com_ldq_list_WifiManager
- * Method: getScanResultsA
- * Signature: ()[Lcom/ldq/list/ScanResult;
- */
- JNIEXPORT jobjectArray JNICALL Java_com_ldq_list_WifiManager_getScanResultsA (JNIEnv *env, jclass cls)
- {
- jclass cls_array=env->FindClass("java/lang/Object");
- jobjectArray obj_array=env->NewObjectArray(2,cls_array,0);
- jclass cls_obj = env->FindClass("com/ldq/list/ScanResult");
- jmethodID m = env->GetMethodID(cls_obj,"<init>","()V");
- jfieldID fid_ssid = env->GetFieldID(cls_obj,"ssid","Ljava/lang/String;");
- jfieldID fid_mac = env->GetFieldID(cls_obj,"mac","Ljava/lang/String;");
- jfieldID fid_level = env->GetFieldID(cls_obj,"level","I");
- for(int i=0;i<2;i++)
- {
- jobject obj=env->NewObject(cls_obj,m);
- jobject o1=env->NewStringUTF("AP2");
- env->SetObjectField(obj,fid_ssid,o1);
- jobject o2=env->NewStringUTF("22-22-22-22-22-22");
- env->SetObjectField(obj,fid_mac,o2);
- env->SetIntField(obj,fid_level,-66);
- env->SetObjectArrayElement(obj_array,i,obj);
- }
- return obj_array;
- }
- /*
- * Class: com_ldq_list_WifiManager
- * Method: getScanResults
- * Signature: ()Ljava/util/List;
- */
- JNIEXPORT jobject JNICALL Java_com_ldq_list_WifiManager_getScanResults (JNIEnv *env, jclass cls)
- {
- jclass m_cls_list = env->FindClass("java/util/ArrayList");
- jmethodID m_mid_list = env->GetMethodID(m_cls_list,"<init>","()V");
- jobject m_obj_list = env->NewObject(m_cls_list,m_mid_list);
- jmethodID m_mid_add = env->GetMethodID(m_cls_list,"add","(Ljava/lang/Object;)Z");
- jclass m_cls_result = env->FindClass("com/ldq/list/ScanResult");
- jmethodID m_mid_result = env->GetMethodID(m_cls_result,"<init>","()V");
- jobject m_obj_result = env->NewObject(m_cls_result,m_mid_result);
- jfieldID m_fid_1 = env->GetFieldID(m_cls_result,"ssid","Ljava/lang/String;");
- jfieldID m_fid_2 = env->GetFieldID(m_cls_result,"mac","Ljava/lang/String;");
- jfieldID m_fid_3 = env->GetFieldID(m_cls_result,"level","I");
- env->SetObjectField(m_obj_result,m_fid_1,env->NewStringUTF("AP6"));
- env->SetObjectField(m_obj_result,m_fid_2,env->NewStringUTF("66-66-66-66-66-66"));
- env->SetIntField(m_obj_result,m_fid_3,-66);
- env->CallBooleanMethod(m_obj_list,m_mid_add,m_obj_result);
- return m_obj_list;
- }
【转】JNI 对象处理的更多相关文章
- JNI 对象处理 (转)
JNI 的基本问题就是解决 Java 和 C++ 代码互相调用的通信问题,在 C++ 代码编写过程中最大的问题莫过于适应其中的代码编写规则,C++调用或是返回的内容必须遵守 JVM 和 C++ 代码的 ...
- JNI系列——PassData
1.在工程目录下创建xxx.jni包并在该包下创建JNI类 2.在JNI类中声明所有的本地方法,并加载库 3.在MainActivity类中实例化JNI对象,并调用其方法 4.通过Javah生成的方法 ...
- 本地C代码中创建Java对象
作者:唐老师,华清远见嵌入式学院讲师. 创建Java域的对象就是创建Java类的实例,再调用Java类的构造方法. 以Bitmap的构建为例,Bitmap中并没有Java对象创建的代码及外部能访问的构 ...
- 深入浅出 - Android系统移植与平台开发(九)- JNI介绍
作者:唐老师,华清远见嵌入式学院讲师. JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官 ...
- 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10
关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...
- JNI介绍(转)
源:JNI介绍 JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的An ...
- JNI 引用问题梳理(转)
局部引用: JNI 函数内部创建的 jobject 对象及其子类( jclass . jstring . jarray 等) 对象都是局部引用,它们在 JNI 函数返回后无效: 一般情况下,我们应该依 ...
- JNI介绍
JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的Android中有着 ...
- JNI基础知识
JNI是在学习Android HAL时必须要面临一个知识点,假设你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的Android中有着 ...
随机推荐
- c++矩阵运算
优化了一些算法 #pragma once #include <iostream> #include <iomanip> #include <string> #def ...
- 自定义HtmlHelper方法
原文:http://www.cnblogs.com/wenjiang/archive/2013/03/30/2990854.html HtmlHelper方法是ASP.NET MVC中非常强大的特性, ...
- Android常用第三方框架
1.volley (截击) 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载: (2) 网络请求的排序(sch ...
- oracle 里面定时执行任务,比如存储过程内容等。
DECLARE job_no_ NUMBER; BEGIN DBMS_JOB.SUBMIT(job_no_, 'proc_qszx_dw_sc(' ...
- VS2010调试时候未响应
这几天使用vs2010,调试时候经常未响应,等了半天才缓过来,严重影响心情,决定解决这个问题. 搜寻一番,试着关闭VS,重新设置了vs2010的环境(在vs2010命令提示符下,执行devenv.ex ...
- 灵活运用绑定变量---declare匿名块使用绑定变量
declare type cur01 is ref cursor; v_cur cur01; v_match123 varchar2(2000); v ...
- 【转】iOS-Core-Animation-Advanced-Techniques(四)
原文:http://www.cocoachina.com/ios/20150105/10812.html 隐式动画和显式动画 隐式动画 按照我的意思去做,而不是我说的. -- 埃德娜,辛普森 我们在第 ...
- 解决右滑返回手势和UIScrollView中的手势冲突
当在一个viewController中添加了scrollView或者tableView的时候,贴边侧滑返回的时候会首先触发滚动而失效,要解决这个问题,需要通过requireGestureRecogni ...
- 设置css三种方法的优先级
有的小伙伴问了,如果有一种情况:对于同一个元素我们同时用了三种方法设置css样式,那么哪种方法真正有效呢?在下面代码中就出现了这种情况 1.使用内联式CSS设置“超酷的互联网”文字为粉色. 2.然后使 ...
- 极端气候频现 五款开发天气预报应用的API
http://www.csdn.net/article/2014-02-07/2818322-weather-forecast-api-for-developing-apps