• reinterpret_cast 和static_cast
    指针转换

    1
    2
    3
    4
    C c;
    //0xbebf1f94,0xbebf1f94,0xbebf1f98
    __android_log_print(ANDROID_LOG_INFO, "jni", "%p,%p,%p", &c, reinterpret_cast<B *>(&c),
    static_cast<B *>(&c));
  • std::unique_ptr
    智能指针,使用智能指针能轻易写出异常安全的代码,因为当对象退出作用域时,智能指针将自动调用对象的析构函数,避免内存泄露:

    1
    2
    3
    4
    5
    //这种写法当下面出现异常是,会导导致ptr内存无法释放,或者try{};
    Widget ptr = new Widget;
    //下面这种写法内存会被自动释放
    std::unique_ptr<Widget> ptr{ new Widget };
    //unique_ptr是用来独占地持有对象的,所以通过同一原生指针来初始化多个unique_ptr是错误的;
  • auto
    自动推断变量的类型

    1
    2
    3
    auto aa = c;
    //auto 可以自动推断出变量的类型,通过typeid函数可以输出函数的类型,
    __android_log_print(ANDROID_LOG_INFO,"jni","type %s", typeid(aa).name());
  • jni数组操作问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    jsize len = env->GetArrayLength(inputs_);
    //通过NewIntArray创建数组
    jintArray outputs = env->NewIntArray(len);
    jint nativeArray[len];
    env->GetIntArrayRegion(inputs_,0,len,nativeArray);

    for (int i = 0; i < len; ++i) {
    nativeArray[i] += 1;
    }
    env->SetIntArrayRegion(outputs,0,len,nativeArray);

    //第二种方式
    jint *inputs = env->GetIntArrayElements(inputs_, NULL);
    for (int i = 0; i < len; ++i) {
    inputs[i] += 1;
    }
    env->SetIntArrayRegion(outputs,0,len,inputs);
    env->ReleaseIntArrayElements(inputs_, inputs, 0);
  • tree -N 文件路径,以树形接口打印当前的目录结构