分享

浅谈如何用JNI的代码调用java接口

 昵称15907169 2014-08-13
很多人第一次用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;
  }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多