java中的Bitmap类型通过jni传进cpp后如何转换成IPLImage*类型呢?谢谢!
1个回答
展开全部
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
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);
}
}
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); }}
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
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);
}
}
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); }}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询