Class doesn't implement Cloneable之怪象
来源:互联网 发布:cocos2d x游戏源码 编辑:程序博客网 时间:2024/05/16 19:56
1. 报错:
- 11-20 14:06:10.89: W/dalvikvm(10190): threadid=15: thread exiting with uncaught exception (group=0x4001d400)
- 11-20 14:06:10.360: E/AndroidRuntime(10190): FATAL EXCEPTION: GLThread 10
- 11-20 14:06:10: E/AndroidRuntime(10190): java.lang.CloneNotSupportedException: Class doesn't implement Cloneable
- 11-20 14:06:10.360: E/AndroidRuntime(10190): at java.lang.Object.clone(Object.java:79)
- 11-20 14:06:10.360: E/AndroidRuntime(10190): 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之怪象
- UIL doesn't support scheme(protocol) by default You should implement this support yourself
- BI商业智能项目遭遇之怪象
- MySQL之Field 'email' doesn't have a default value
- hibernate学习之table doesn't exists问题
- IT doesn't Matter
- MSTest doesn’t work
- set_terminate doesn't work
- vi doesn't work
- why it doesn't popup multi definitions error for method in .h class for C++?
- java.io.FileWriter class doesn’t use UTF-8 by default
- undefined method `devise' for User(Table doesn't exist):Class解决方法
- model class django.contrib.contenttypes.models.contenttype doesn't declare an explicit app_label and
- Class doesn't contain any JAX-RS annotated methods less... (Ctrl+F1)
- RuntimeError: Model class models.Seller doesn't declare an explicit app_label and isn't in an applic
- Cloneable
- Cloneable
- Cloneable
- GKPeerPickerController开启手机设置菜单的蓝牙开关
- unity学习笔记【场景加载】
- 我要改变!
- Java:微软CodeHunt2.06 2.07总结
- eclipse点击一个变量,使相同名称变量高亮显示
- Class doesn't implement Cloneable之怪象
- Annotation 零基础学习
- 线段树问题
- 在C#中子线程如何操作主线程中窗体上控件
- iOS 拉伸图片不走形
- 根文件系统制作
- dlopen函数详解
- C#总结
- php-memcached内存缓存的使用