第一次用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