(转载)JNI c调用Java 返回值为String

(转载)JNI c调用Java 返回值为String

Java定义:

    public  String  getSignatureInfo() {
        try {
            PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), PackageManager.GET_SIGNATURES);
            android.content.pm.Signature[] signs = packageInfo.signatures;
            android.content.pm.Signature sign = signs[0];
            byte[] signature = sign.toByteArray();
 
            X509Certificate cert = parseSignature(signature);
 
            return  getMessageDigest("SHA1", signature);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

c代码:

JNIEXPORT jint JNICALL Java_com_letv_jr_safesignaturelibrary_JrSignature_getCLangString(JNIEnv *env, jobject obj)
{
  //得到类
  jclass clazz=(*env)->GetObjectClass(env,obj);
  if(clazz==0){
    return;
  }
  //缓存类
  targetClass=(jclass)(*env)->NewGlobalRef(env,clazz);
  if(targetClass==0){
    return;
  }
  //缓存对象
  targetObject=(jobject)(*env)->NewGlobalRef(env,obj);
  if(targetObject==0){
    return;
  }
  //缓存方法
  targetMethodID=(*env)->GetMethodID(env,clazz,"getSignatureInfo","()Ljava/lang/String;");
  if(targetMethodID==0){
    return;
  }
  //拿到Java返回值
  jstring pring=(jstring)(*env)->CallObjectMethod(env,obj,targetMethodID);
  //转换成char型
  char *print=(char *)(*env)->GetStringUTFChars(env,pring,0);
  if (strcmp(secret, print) == 0){
    return 0;
  }else{
    return 1;
  }
}

//------------------------------------------------------------------------------

假如这里的getSignatureInfo()方法是静态的方法。

(1)获取方法签名应该用方法:GetStaticMethodID();

(2)调用的静态方法的地方则是:CallStaticObjectMethod();

猜你喜欢

转载自blog.csdn.net/zhuhai__yizhi/article/details/82352249