JNI 对象处理 (转)
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[]= {"first",
"second",
"third",
"fourth",
"fifth"}; ret= (jobjectArray)env->NewObjectArray(,
env->FindClass("java/lang/String"),
env->NewStringUTF("")); for(i=;i<;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,-);
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(,cls_array,); 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=;i<;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,-); 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,-); env->CallBooleanMethod(m_obj_list,m_mid_add,m_obj_result); return m_obj_list;
}转自:http://leidiqiu.iteye.com/blog/720307
JNI 对象处理 (转)的更多相关文章
- 【转】JNI 对象处理
原文网址:http://leidiqiu.iteye.com/blog/720307 JNI 的基本问题就是解决 Java 和 C++ 代码互相调用的通信问题,在 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中有着 ...
随机推荐
- Tomcat代码执行漏洞(CVE-2017-12615)的演绎及个人bypass
0x00 漏洞简介 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞. 漏洞CVE编号:CVE-2017-12615和CVE-2017-12616. 其中 远程代码执行漏洞 ...
- jQuery自定义插件--banner图滚动
前言 jQuery是一个功能强大的库,提供了开发JavaScript项目所需的所有核心函数.很多时候我们使用jQuery的原因就是因为其使用插件的功能,然而,有时候我们还是需要使用自定义代码来扩展这些 ...
- 计算机基础--Java中int char byte的关系
计算机基础--Java中int char byte的关系 重要:一个汉字占用2byte,Java中用char(0-65535 Unicode16)型字符来存字(直接打印输出的话是字而非数字),当然要用 ...
- Tomcat的四种基于HTTP协议的Connector性能比较
Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: <Connector port="8081" protocol="org.apache. ...
- Vim的基本使用(二)
本文为原创文章,转载请标明出处 目录 11.可视模式 12.指定计数 13.重复命令 14.外部命令 15.命令行编辑 16.文件编辑 17.分割窗口 18.GUI命令 19.配置 20.Vim Ch ...
- POJ 2359 Questions(约瑟夫环——数学解法)
题目链接: http://poj.org/problem?id=2359 题意描述: 输入一个字符串 按照下面的规则,如果剩下的最后一个字符是'?',输出"Yes",如果剩下的最后 ...
- Block使用的简单总结
一.Block简单的使用 1.block当作参数来传递 如下定义一个没有返回值无参数的block,并把它作为参数,让系统调用,注意:这里是系统在调用,不是我们调用 那么为什么需要把block当作参数去 ...
- ch4-注册 登陆 实现 cookie使用
1 mysql 回调函数优化 1.1 mysql代码: config.query(handlerStr, value, function (err, data) { callback &&am ...
- Python接口自动化——soap协议传参的类型是ns0类型的要创建工厂方法纪要
1:在Python接口自动化中,对于soap协议的xml的请求我们可以使用Suds Client来实现,其soap协议传参的类型基本上是有2种: 第一种是传参,不需要再创建啥, 第二种就是ns0类型的 ...
- 使用beanstalkd实现定制化持续集成过程中pipeline
持续集成是一种项目管理和流程模型,依赖于团队中各个角色的配合.各个角色的意识和配合不是一朝一夕能练就的,我们的工作只是提供一种方案和能力,这就是持续集成能力的服务化.而在做持续集成能力服务化的过程中, ...