1. 报错:

  1. -20 ::): threadid=: thread exiting with uncaught exception (group=0x4001d400)
  2. -20 ::): FATAL EXCEPTION: GLThread
  3. -20 ::: E/AndroidRuntime(): java.lang.CloneNotSupportedException: Class doesn't implement Cloneable
  4. -20 ::: E/AndroidRuntime():    at java.lang.Object.clone(Object.java:)
  5. -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之怪象的更多相关文章

  1. [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 ...

  2. Java 深拷贝、浅拷贝及Cloneable接口

    Cloneable接口是一个空接口,仅用于标记对象,Cloneable接口里面是没有clone()方法,的clone()方法是Object类里面的方法!默认实现是一个Native方法 protecte ...

  3. 实现 Cloneable 需要注意

    产品Product里面包含BaseInfo对象:Product(productName,companyName,baseinfo)如果implement Cloneable  需要实现   注意强转类 ...

  4. Cloneable注解使用

    使用 clone()方法的类必须 implement Cloneable 如果没有继承,clone()方法会报错 java.lang.CloneNotSupportedException异常

  5. java开发——Cloneable接口、clone()方法和深浅拷贝

    1.实现Cloneable接口表明该类的对象是允许克隆的. 2.允许克隆的意思是:可以调用clone()方法. 3.深拷贝还是浅拷贝,取决于如何重写Object的clone()方法. 4.原对象和克隆 ...

  6. 深拷贝、浅拷贝与Cloneable接口

    深拷贝与浅拷贝 浅拷贝 public class Student implements Cloneable{ Integer a; Integer b; @Override protected Obj ...

  7. Java面试葵花宝典

    面向对象的特征有哪些方面  1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题,而6. 只是选择其中的一 ...

  8. java面试题小全

    面向对象的特征有哪些方面   1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题,而6. 只是选择其中的 ...

  9. .Net面试葵花宝典

    1.                面向对象的特征有哪些方面    抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中 ...

随机推荐

  1. ActiveMQ使用经验与优化

    摘自:http://blog.csdn.net/m13321169565/article/details/8081314 1.1 不要频繁的建立和关闭连接 JMS使用长连接方式,一个程序,只要和JMS ...

  2. bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check

    [Wc2010]重建计划 Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 4345  Solved: 1054[Submit][Status][Disc ...

  3. java中String初始化的两种方式

    转自:http://www.diybl.com/course/3_program/java/javajs/2007104/75886.html       字符串可能是任何程序语言中都会出现的对象,j ...

  4. Springboot 版本+ jdk 版本 + Maven 版本的匹配

    Spring boot 版本 Spring Framework jdk 版本 maven 版本 1.2.0 版本之前 6 3.0 1.2.0 4.1.3+ 6 3.2+ 1.2.1 4.1.3+ 7 ...

  5. FZOJ Problem 2219 StarCraft

                                                                                                        ...

  6. javaweb学习总结(十四)——JSP原理(转)

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  7. MySQL完全备份脚本:数据+二进制日志+备份日志

    一. 脚本须知 1.mysql数据文件和二进制日志文件最好保存在不同的分区或存储设备上 2.备份完成后注意修改数据的权限以防止泄露重要信息,哪些主机哪些用户可以用来恢复 3. 查看导出的2进制日志文件 ...

  8. Adoquery的 moveby和GotoBookmark,RecNo

    GotoBookmark 是必须存在的记录,再次返回原来那个记录的位置,但是原来的那个记录必须存在,所以不适合[删除订单后回到原来的位置],因为原来的订单已经不存在了,删除了, moveby(),从当 ...

  9. iOS-tableView上拉加载更多后,界面出现偏移

    问题描述: 在做tableview的界面展示的时候,cell用自动计算高度的.但是在上拉加载更多的时候,数据请求完后,刷新界面,界面的顶部就出现了偏移 分析: 查阅资料后发现,当tableView的c ...

  10. js库-AngularJS

    我是一个不思进取的前端. 我想按部就班的工作. 我想得过且过. 老天呀!你咋又逼迫我学习对于我来说的新知识呢!!!!!!!我想哭呀!!!!! 在某个代码项目中我看到了{{??}}这么个标记!我的神呀! ...