Class doesn't implement Cloneable之怪象
1. 报错:
- -20 ::): threadid=: thread exiting with uncaught exception (group=0x4001d400)
- -20 ::): FATAL EXCEPTION: GLThread
- -20 ::: E/AndroidRuntime(): java.lang.CloneNotSupportedException: Class doesn't implement Cloneable
- -20 ::: E/AndroidRuntime(): at java.lang.Object.clone(Object.java:)
- -20 ::: E/AndroidRuntime(): at com.jnitest.nativetest(Native Method)
2. 现场说明:
在进行android项目开发时, 想用java代码调用jni的test函数,, 而且再通过c的callCallBack函数, 回调到java的onCallback函数., 发生以上错误.
3. 代码:(这里仅仅列出重要的,关键的代码.)
java代码:
public class NativeClass {
private static String TAG= "NativeClass";
static {
System.loadLibrary("test-jni");
}
public static int onCallBack(int event, int type,String str) { //回调回来的回调函数
Log.i(TAG, "onCallBack======= " + event);
Log.i(TAG, "onCallBack======= " + type);
Log.i(TAG, "onCallBack======= " + str);
return event;
}
public static native int test(); //native函数
c代码:
jobject my_obj;
JNIEnv* my_env;
extern "C" int callCallBack(int event, int type, const char *str) ;
extern "C"
{
//用于调用java的callback
int callCallBack(int event, int type, const char *str)
{
int err = 1000;
jclass objClass = (my_env)->FindClass("com/jnitest/native/NativeClass");
if(!objClass) {
return -1;
}
//获取并调用java层的onCallBack函数
jmethodID methodId = (my_env)->GetStaticMethodID(objClass, "onCallBack", "(IILjava/lang/String;)I");
if (methodId == 0) {
LOGDV("here can not find method %s\n", "onCallBack");
} else {
jstring data = (update_env)->NewStringUTF(str));
err = (my_env)->CallStaticIntMethod(objClass, methodId, event, type, data);
if(data) my_env->DeleteLocalRef(data);
}
my_env->DeleteLocalRef(objClass);
return err;
}
//jni native函数.
JNIEXPORT jstring JNICALL
Java_com_jnitest_native_test( JNIEnv* env, jobject thiz,jstring testStr )
{
my_env = env; //必须保存,用于在回调的时候获取回调函数所在的class.
my_obj = thiz; //在本程序中,没实用到这个变量.
const char *test_char = (env)->GetStringUTFChars(testStr, NULL);
//调用callCallBack
int i = callCallBack(0,1,test_char);
return (env)->NewStringUTF(test_char);
}
}
測试代码:
maintest.java:
void testFunc() {
String s = NativeClass.test("ssss");
Log.i("jniTest", " testFunc s = " + s);
}
測试结果:
onCallBack=======0
onCallBack=======1
onCallBack=======ssss
testFunc s =ssss
4. 分析与 解决:
分析,:
依据错误提示:
1). 有clone相关错误;
2) 就发生在NativeClass的test函数中.
3). 那么, 是哪个类没有进行clone?
或者, 根本就不是clone的原因?
4). NativeClass中,没有数据成员, 理论上讲,就不须要进行克隆.所以,应该不是NativeClass克隆的原因.
5). 在jni的test函数中,有对于my_obj的赋值,会不会是这个变量的赋值导致的呢?
解决: 因为my_obj没实用到(本来赋值后想用的), 并且可能会引起错误,所以,将这个变量的声明和赋值语句都去掉,
再測试,程序正常执行.
5. 总结:
1) 由java调用c时,一定要注意參数的正确传递.
2) 本例展示了怎样用java调用c,再由c调用到java的过程.
3) 本例来源于android程序开发.
Class doesn't implement Cloneable之怪象的更多相关文章
- [FindBugs分析记录]Class defines clone() but doesn't implement Cloneable
官网解释: This class defines a clone() method but the class doesn't implement Cloneable. There are some ...
- Java 深拷贝、浅拷贝及Cloneable接口
Cloneable接口是一个空接口,仅用于标记对象,Cloneable接口里面是没有clone()方法,的clone()方法是Object类里面的方法!默认实现是一个Native方法 protecte ...
- 实现 Cloneable 需要注意
产品Product里面包含BaseInfo对象:Product(productName,companyName,baseinfo)如果implement Cloneable 需要实现 注意强转类 ...
- Cloneable注解使用
使用 clone()方法的类必须 implement Cloneable 如果没有继承,clone()方法会报错 java.lang.CloneNotSupportedException异常
- java开发——Cloneable接口、clone()方法和深浅拷贝
1.实现Cloneable接口表明该类的对象是允许克隆的. 2.允许克隆的意思是:可以调用clone()方法. 3.深拷贝还是浅拷贝,取决于如何重写Object的clone()方法. 4.原对象和克隆 ...
- 深拷贝、浅拷贝与Cloneable接口
深拷贝与浅拷贝 浅拷贝 public class Student implements Cloneable{ Integer a; Integer b; @Override protected Obj ...
- Java面试葵花宝典
面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题,而6. 只是选择其中的一 ...
- java面试题小全
面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题,而6. 只是选择其中的 ...
- .Net面试葵花宝典
1. 面向对象的特征有哪些方面 抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中 ...
随机推荐
- [图论训练]1143: [CTSC2008]祭祀river 二分图匹配
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在 水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...
- [CF888G] Xor-mst (Trie 树,最小生成树)
题目链接 Solution \(Trie\) 树 + 启发式合并. 考虑到是异或,于是按位贪心.让高位的尽量相同. 然后要计算每棵子树的代价,似乎并没有很好的方法?? 于是只能启发式合并. 对于每一个 ...
- jsp实现文件下载,out = pageContext.pushBody();out.close();不用写到jsp中
测试jsp: <%@ page contentType="text/html; charset=gbk" %> <% try{ com.enfo.intrust. ...
- vue 配合 element-ui使用搭建环境时候遇到的坑
在需要使用element-ui的时候,直接引入文件,发现会报错,解析不了css文件和字体,需要在webpack里面配置上css-loader和style-loader,最好的做法是把element-u ...
- 微信小程序中 input组件影响页面样式的问题
input组件有个默认的宽高,好像是不能清除的,在使用flex布局的时候,发现会影响到页面的布局,以为是flex布局的问题,改为float布局试了下也是同样的问题,试着把input标签换成别的标签,问 ...
- 2018.7.31 Noip2018模拟测试赛(十六)
日期: 七月最后一天 总分: 300分 难度: 提高 ~ 省选 得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...
- 标准C程序设计七---44
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- Linux 之 服务以及进程
服务以及进程 参考教程:[千峰教育] 命令: vmstat: 结果: procs -----------memory---------- ---swap-- -----io---- --system- ...
- 关于[WinError 10054] 远程主机强迫关闭了一个现有的连接。
之前一直用python实现qq邮箱自动发送,都弄的好好的,然后今天一打开,就出现如题的错误,百度了许多,说,可能发送邮件次数过多,被当作是攻击,建议换个邮箱,换了也不行, 最后用手机给电脑分享Wifi ...
- 拼题 L2-001 紧急救援 最短路计数+记录路径
https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 L2-001 紧急救援 (25 分) 作 ...