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. 面向对象的特征有哪些方面 抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中 ...
随机推荐
- iOS--------手势识别的详细使用:拖动、缩放、旋转、点击、手势依赖、自定义手势
1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性. iOS系统在3.2以后,为方便开发这使用一些常用的手势,提供了 ...
- 【bzoj1163/bzoj1339】[Baltic2008]Mafia 网络流最小割
题目描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标点 ...
- 【Luogu】P3205合唱队(区间DP)
题目链接 通过这题我发现我已经不会DP了 区间DP,f[i][j]是从左面转移来的,d[i][j]是从右面转移来的 然后DP方程是 ]) f[i][j]+=f[i+][j]; ][j]; f[i][j ...
- kb-07专题--线段树-01-单点修改,区间查和
给定区间长度,然后给两个操作,单点增加值和单点减值,询问一个区间的人数和:(水) 代码如下: /* 写的第一个线段树,丑: */ #include<iostream> #include&l ...
- [CODEVS1917] 深海机器人问题(最小费用最大流)
传送门 [问题分析] 最大费用最大流问题. [建模方法] 把网格中每个位置抽象成网络中一个节点,建立附加源S汇T. 1.对于每个顶点i,j为i东边或南边相邻的一个节点,连接节点i与节点j一条容量为1, ...
- maven项目中配置mvn源
在pom.xml中配置 <repositories> <!--for others--> <repository> <id>alimaven</i ...
- poj 2492 A Bug's Life 二分图染色 || 种类并查集
题目链接 题意 有一种\(bug\),所有的交往只在异性间发生.现给出所有的交往列表,问是否有可疑的\(bug\)(进行同性交往). 思路 法一:种类并查集 参考:https://www.2cto.c ...
- ListView列表刷新方法的区别
ListView列表刷新方法的区别 ListView对象的刷新方法: listNote.invalidate();重绘所有组件listNote.invalidateViews();重绘组件[包含所有的 ...
- The disk contains an unclean file system
Ubuntu : Status 14: The disk contains an unclean file system By mkyong | July 23, 2014 | Viewed : 10 ...
- spring MVC学习之二
什么是Spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MV ...