JNI调用java的接口

来源:互联网 发布:点阵取模软件 编辑:程序博客网 时间:2024/05/18 10:10

第一次用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;
}
一个简单的测试用的例子,下载地方http://download.csdn.net/detail/lwei3600103/5854701