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,数值设置不正确,该如何解决?
你这样找类名称是找不到的。要找到类的具体路径,从jni所在的那一层级开始往下目录查找,应该是这样找类,
jclass objresults = env->FindClass("com/XXXX/XXXX/MyActivity/MyVersion");
然后jfieldID my_majorversion = env->GetFieldID(objresults,"majorVersion","I");
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}
最后那个MyVersion这个类是目录里面的成员类,我不确定是否是继续通过“/”来找到,我自己做,是在MyActivity这个类层级新建一个.java文件,声明MyVersion这个类,就百分百可以找到,你这样的做法,只能尝试一下com/XXXX/XXXX/MyActivity/MyVersion
或com/XXXX/XXXX/MyActivity$MyVersion