很多人第一次用JNI的代码去调用java接口,都比较会犯一下几点错误,合肥达内小编 这就列举一下,前车之鉴后事之师么,1,参数的疑问 long 应该是J 而不是L 如果是 (long ,string ,sting)返回值为int,"(JLjava/lang/String;Ljava/lang/String;)I" J后边不要加;网上看的的时分许多都是L 这次就被这个给坑了。2,jni调用java的办 法的前面生成目标里面不要有methodID ,在生成jobj时分就会调用办法。这样办法就 会被调用两次。3,jni 的char* - JString 最佳仍是用NewStringUTF ,网上那个许 多转帖那个函数在最终将jobject 强行转换为jstring时会形成java 程序溃散。 1,java代码 class ScanRecord{ private String nValue = ""; public int setValue(long i ,String value,String value2){ System.out.print("start2"); nValue = value; nValue = value2; if(value2.length() > value.length()){ return 10; } else { return 20; } } 2,JNI代码 JNIEXPORT jboolean JNICALL Java_hansense_capture_JNICapture_capture (JNIEnv *env, jobject obj, jobject vec) { jclass cls = env->FindClass("hansense/capture/JNICapture$ScanRecord"); if(cls == 0) { printf("cls == 0 n"); return false; } jmethodID jmid_setValue = env->GetMethodID (cls,"setValue","(JLjava/lang/String;Ljava/lang/String;)I"); if(jmid_setValue == 0 ){ printf("jmid_setValue is 0 n"); } else{ if(jmid_setValue == NULL){ printf("jmid_setValue is NULL n"); } else{ printf("11111111111 n"); } } jstring str = env->NewStringUTF("asdasdasd"); jstring str2= env->NewStringUTF("aaa"); jlong i =10; env->CallIntMethod(vec,jmid_setValue,i,str,str2) ; return true; } |
|
来自: 昵称15907169 > 《JAVA》