小编Pro*_*mer的帖子

部署Android应用程序Qt 5.1

我一直在尝试将一个简单的Qt应用程序部署到android但没有运气.细节如下

  1. Qt版本:从这里下载的Qt 5.1.0 for Android(Windows 32位)

  2. Qt Creator版本:Qt Creator 2.7.2

我在Qt Creator中设置了以下选项

Android配置

  1. Android SDK位置:C:\ adt-bundle-windows-x86-20130717\adt-bundle-windows-x86-20130717\sdk

  2. Android NDK位置:C:\ android-ndk-r8e

  3. Ant位置:C:\ Program Files\Java\jdk1.7.0_25

  4. AVD名称:AndroidAVD(API Level 17,armeabi-v7a)

套件配置

  1. 套件名称:Android for arm(GCC 4.4.3,Qt 5.1.0)(默认)

  2. 设备类型:Android

  3. 设备:在Android上运行

  4. Sysroot:它是空的

  5. 编译:GCC(第4.4.3节)

  6. Android GDB服务器:C:\ android-ndk-r8e\prebuilt\android-arm\gdbserver

  7. 调试器:C:\ android-ndk-r8e\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\bin\arm-linux-androideabi-gdb.exe

  8. Qt版本:5.1.0(android_armv7)(C:\ Qt\Qt5.1.0\5.1.0\android_armv7\bin\qmake.exe)

  9. 部署Kit的配置(对于Release和Debug):选中Deploy local Qt libraries和Use Local Qt libraries选项

  10. 操作系统:Windows 7 64位

问题

当我尝试构建时,一切都很好.我在构建目录中获得了libTheTestApp.so.此外,项目目录现在包含一个名为"android"的文件夹,其中包含清单文件和一些其他文件.

当我尝试运行应用程序时,模拟器启动但我找不到我的应用程序.如果我关闭我的模拟器并返回到Qt Creator,我会收到以下错误

请稍候,搜索适合目标的设备:android-17.
构建/部署项目时出错TheTestApp(套件:Android for arm(GCC 4.4.3,Qt 5.1.0))执行步骤'部署到Android设备'时

如果我在模拟器运行时执行"adb devices",我会获得正在运行的模拟器的id

此外,我尝试在此处发布此问题之前搜索互联网.我找到了这个链接.

我的问题是如何将Qt5应用程序部署到Android设备?是否有任何链接说明如何做到这一点?我问这个是因为我在构建应用程序时遵循了Qt5ForAndroidBuilding链接中提供的说明.

谢谢你的时间.

deployment qt android qt5

9
推荐指数
1
解决办法
2万
查看次数

从QAbstractListModel中删除行

我有一个自定义模型,它源自QAbstractListModel,它暴露给QML.我需要支持添加新项目和删除现有项目的操作.虽然插入操作没有任何问题,但删除操作会导致应用程序在调用endRemoveRows()函数时崩溃.

    void GPageModel::addNewPage()
    {
        if(m_pageList.count()<9)
        {
            beginInsertRows(QModelIndex(),rowCount(),rowCount());
            GPage * page = new GPage();
            QQmlEngine::setObjectOwnership(page,QQmlEngine::CppOwnership);
            page->setParent(this);
            page->setNumber(m_pageList.count());
            page->setName("Page " + QString::number(m_pageList.count()+1));
            m_pageList.append(page);
            endInsertRows();
        }
    }

    void GPageModel::removePage(const int index)
    {
        if(index>=0 && index<m_pageList.count())
        {        
            beginRemoveRows(QModelIndex(),index,index);
            qDebug()<<QString("beginRemoveRows(QModelIndex(),%1,%1)").arg(index);
            GPage * page = m_pageList.at(index);        
            m_pageList.removeAt(index);
            delete page;
            endRemoveRows();
        }
    }
Run Code Online (Sandbox Code Playgroud)

GPage类派生自QObject.我很想知道在尝试调用endRemoveRows()时导致应用程序崩溃的原因.当调用endRemoveRows()时,我在"QList :: at:"索引超出范围""时得到"ASSERT失败."如何从QAbstracListModel中删除行?还有其他方法吗?

我在Windows 7 64位计算机上使用Qt 5.1.0.

qt qabstractitemmodel qml qabstractlistmodel qtquick2

6
推荐指数
1
解决办法
9978
查看次数

来自 NDK/JNI 的 Android APK 篡改检测

问题

我有一些钥匙,我想保证它的安全。目前,原生共享库按需生成它们。我的 apk 使用这个共享库来获取密钥。当前实现的问题是攻击者可能会提取 apk,复制共享库并调用生成密钥的函数并获取密钥。因此,我想确保共享库仅在我的 apk 调用时才生成有效密钥。

解决这个问题的方法

解决这个问题的方法涉及到 NDK 端的 apk 篡改检测。基本思想是在运行时从 JNI 获取调用 APK 的签名。如果签名有效,则库生成有效密钥,否则生成无效密钥。

这种方法的已知局限性

  • 据了解,并非100%万无一失。
  • 由于密钥在客户端的设备中并且客户端拥有硬件,因此专门的攻击者可以访问生成的密钥。

到目前为止我做了什么到目前为止 的实现是基于这个stackoverflow帖子中提到的想法

  • 读取存储在 /proc/self/maps 中的进程内存
  • 找到包含文本“.dex”的行。
  • 获取DEX文件区域的起止地址

    FILE *fp;    
    fp = fopen("/proc/self/maps", "r");    
    if(fp!=NULL){
        char line [ 2048 ];
        while ( fgets ( line, sizeof line, fp ) != NULL ) /* read a line */
        {
            if (strstr(line, ".dex") != NULL) {
    
                //This is the line we want
                __android_log_write(ANDROID_LOG_INFO,"DexFile",line);
                char * startingAddress;
                char * endingAddress;
                startingAddress = …
    Run Code Online (Sandbox Code Playgroud)

security android android-ndk apk dex

6
推荐指数
0
解决办法
1804
查看次数