QT 環境的 Android 配置和編譯

1.  QT 5.9.0

     工具 -> 選項

     注意:  QT 5.9.0 支持 NDK r10e.   更新 的 NDK 不支持。

 

2.  提供 JAVA 的 JNI 接口

   QT 和 NDK 不同,  默認 so 沒有 JNI_OnLoad, 需要提供。

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
   return JNI_VERSION_1_4;
}

JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved)
{

}

3. 發佈時  不僅需要  QT系統 的 庫 ( libQt5Widgets.so ) , 還有 NDK的庫 (libgnustl_shared.so)。 

 

4.  JNI中  生成 JAVA類 的標準過程

 

static jobject makeJniResult( JNIEnv *env, int retPointNum, float updateX, float updateY, float updateWidth, float updateHeight,
                              float * pData)
{
    jclass jclassResultInfo = env->FindClass("com/hhtpc/hhstrokesadr/JSketchResult"); // 獲取類 引用

    jmethodID jidResultInfo =
        env->GetMethodID(jclassResultInfo, "<init>", "(I[F[F)V"); // 獲取類的方法,此方法是構造函數
                                        // "(ILjava/lang/String;[B)V" 解釋一下這個字符串,V代表返回空類型, ()號裏面代表三個參數, 分解成三個分別是(我用空格隔開)   I   Ljava/lang/String;  [B   分別代表整數,字符string,和byte[] 自己體會

    float  rect[] ={updateX,updateY,updateWidth,updateHeight};
    jfloatArray jniRect= env->NewFloatArray(4);
    env->SetFloatArrayRegion(jniRect, 0, 4, (const jfloat*)rect);

    jfloatArray jniPoints = env->NewFloatArray( 2 * retPointNum );
    env->SetFloatArrayRegion(jniPoints, 0, 2*retPointNum, (const jfloat*)pData );


    jobject result = env->NewObject(jclassResultInfo, jidResultInfo, retPointNum,jniRect,jniPoints ); // 返回值不需要要釋放
    env->DeleteLocalRef(jniRect);  // 中間變量需要釋放
    env->DeleteLocalRef(jniPoints); // 中間變量需要釋放
    return result;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章