xiefeng272 2018-01-08 03:45 采纳率: 66.7%
浏览 1516
已采纳

java通过jni接口向C++中传值问题

JNI WARNING: instance jfieldID 0x62bb4ff0 not valid for class Ljava/lang/Class; (GetIntField)

in Lcom/xxxx/test/MyActivity;.cmdHUProtoclVersion:(Lcom/xxxx/test/MyActivity$MyVersion;)I (GetIntField)
出现如上的warnning,数值设置不正确,该如何解决?

  • 写回答

3条回答 默认 最新

  • csulizhang 2018-01-08 06:04
    关注

    你这样找类名称是找不到的。要找到类的具体路径,从jni所在的那一层级开始往下目录查找,应该是这样找类,
    jclass objresults = env->FindClass("com/XXXX/XXXX/MyActivity/MyVersion");
    然后jfieldID my_majorversion = env->GetFieldID(objresults,"majorVersion","I");

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • xiefeng272 2018-01-08 03:52
    关注

    java代码

     public class MyActivity extends Activity {
    
        public class MyVersion
        {
            public int majorVersion;
            public int minorVersion;
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            int i =carlifelibstarttest();
            Toast.makeText(this, "Hello world", 10).show();
            System.out.println("Hello world!");
            TextView mTextview = new TextView(this);
            mTextview.setText(stringFromJNI());
            int j=connectionSetup();
            long p = class_init();
    
            carLifeLibInit();
            disconnect();
            carLifeLibDestory();
            MyVersion myVersion=new MyVersion();
            myVersion.majorVersion=1;
            myVersion.minorVersion=2;
            System.out.println(String.format("myVersion.majorVersion=%d,myVersion.minorVersion=%d", myVersion.majorVersion,myVersion.minorVersion));
            cmdHUProtoclVersion(myVersion);
            System.out.println(String.format("myVersion.majorVersion=%d,myVersion.minorVersion=%d", myVersion.majorVersion,myVersion.minorVersion));
            setContentView(mTextview);
    
        }
        public native int cmdHUProtoclVersion(MyVersion myVersion);
        public native int carlifelibstarttest();
        public native String stringFromJNI();
        public native long class_init();
        public native int connectionSetup();
        public native int carLifeLibInit();
        public native void carLifeLibDestory();
        public native void disconnect();
        static{
            System.loadLibrary("carlifeJni");
        }
    
    

    jni

     jint Java_com_xxxx_carlife_VehicleNative_cmdHUProtoclVersion(JNIEnv* env, jobject thiz,jobject myobject)
    {
        if(!g_obj)
            g_obj = env->NewGlobalRef(thiz);
        S_HU_PROTOCOL_VERSION *my_version=(S_HU_PROTOCOL_VERSION *)malloc(sizeof(S_HU_PROTOCOL_VERSION));
        jclass clazz;
        jfieldID my_majorversion;
        jfieldID my_minorversion;
    
        clazz= env->GetObjectClass(myobject);  
        if(clazz==NULL)
        {
            D("GetObjectClass Failed!\n");
            return -1;
        }
        my_majorversion=env->GetFieldID(clazz,"majorVersion","I");
        if(my_majorversion==NULL)
        {
            D("Failed to get majorVersion filedID!\n");
            return -1;
        }
        my_minorversion=env->GetFieldID(clazz,"minorVersion","I");
        if(my_minorversion==NULL)
        {
            D("Failed to get minorVersion filedID!\n");
            return -1;
        }
    
        my_version->majorVersion=env->GetIntField(clazz,my_majorversion);
        my_version->minorVersion=env->GetIntField(clazz,my_minorversion);
    
        D("majorVersion = %d,minorVersion = %d\n",my_version->majorVersion,my_version->minorVersion);
        env->SetIntField(clazz,my_majorversion,11);
        env->SetIntField(clazz,my_minorversion,22);
        D("majorVersion = %d,minorVersion = %d\n",my_version->majorVersion,my_version->minorVersion);
    
        return CCarLifeLib::getInstance()->cmdHUProtoclVersion(my_version);
        }
    

    签名

     {"cmdHUProtoclVersion","(Lcom/xxx/test/MyActivity$MyVersion;)I",(void*)Java_com_xxxx_carlife_VehicleNative_cmdHUProtoclVersion}
    
    评论
  • csulizhang 2018-01-08 06:08
    关注

    最后那个MyVersion这个类是目录里面的成员类,我不确定是否是继续通过“/”来找到,我自己做,是在MyActivity这个类层级新建一个.java文件,声明MyVersion这个类,就百分百可以找到,你这样的做法,只能尝试一下com/XXXX/XXXX/MyActivity/MyVersion
    或com/XXXX/XXXX/MyActivity$MyVersion

    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Jupyter Notebook 数学公式不渲染
  • ¥20 ERR_CACHE_MISS 确认重新提交表单
  • ¥20 关于vba使用HTMLfile执行js函数问题
  • ¥60 悬赏求解,通过实时现场摄像头的视频图像识别其他对家打出的麻将牌,识别麻将牌,识别牌墙位置,通过识别对家打出了什么牌
  • ¥15 关于#GPU jetson#的pcie驱动开发问题,如何解决?
  • ¥15 stm32f103zet6 串口5无法收发数据
  • ¥15 关于C语言使用线程队列实现多线程并发
  • ¥15 这个运行,错误在哪里呀,大家看看吧,教导我
  • ¥15 advanceinstaller对话框设置
  • ¥100 正常上网,内部网页无法打开