将SSL证书bye []数组从jni带到flutter

问题描述

我正在通过将证书安全地存储在JNI中并在运行时获取证书来使证书固定。但是当我从JNI获取数据时,我得到了BAD_PKCS12_DATA(pkcs8_x509.c:626),errno = 0)。如果我直接在Flutter代码中设置它,则固定会起作用 List<int> _crt = <int>[45,45,66,69,71,73,78,...]

这是JNI方法

extern "C" JNIEXPORT jintArray JNICALL Java_com_package_android_MainActivity_getCert
        (jnienv *env,jobject This)
{
    int a[] ={45,...};
    jintArray ret = env->NewIntArray(sizeof(a));
    env->SetIntArrayRegion(ret,6,a);
    return ret;
}

MainActivity.kt:

external fun getCert(): IntArray
override fun configureFlutterEngine(@NonNull FlutterEngine: FlutterEngine) {
        super.configureFlutterEngine(FlutterEngine)
        MethodChannel(FlutterEngine.dartExecutor.binaryMessenger,CHANNEL).setMethodCallHandler {
            call,result ->
            if (call.method == "cert") {
                result.success(getCert())
            }
        }
    }

颤振代码

      List<int> _crt;
      _crt = await _platform.invokeMethod("cert");
      //print("CRT: " + _crt.length);
      SecurityContext context = SecurityContext(withTrustedRoots: true);
      context.setTrustedCertificatesBytes(_crt);
      httpClient = new HttpClient(context: context);

我很困惑,为什么从JNI返回的int数组不起作用,但是如果直接在Flutter中直接设置它,也不会有问题?

解决方法

sizeof(a)不能提供a中元素的数量。它提供了所有元素的总大小,以字节为单位。

您想要的是sizeof(a) / sizeof(int)sizeof(a) / sizeof(a[0])