在 AndroidStudio 上编译的 GoggleTest 在使用 arm64 手机时不会出现 Win32 应用程序错误

问题描述 投票:0回答:1

我编译的谷歌测试给了我以下错误:

Error running test executable.

    Path: 'C:/repository/app/build/intermediates/cxx/Debug/6t1p3yv6/obj/arm64-v8a/UnitTest'
    Result: %1 is not a valid Win32 application
    Output:

这当然是真的。我为它提供了一台 Samsung arm64 设备来构建 Android Studio 并在其上运行测试。我的问题是,它显然试图在 Windows 上运行生成的测试,这是行不通的。

测试也位于 AndroidTest 目录中。

这是我的 CMakeLists.txt 为我的 jni 接口构建 c++ 文件。文件和程序名称已更改,但结构相同。

project(ncnncomputervision)

cmake_minimum_required(VERSION 3.14)

# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.5.4-android/sdk/native/jni)
find_package(OpenCV REQUIRED core imgproc)

set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20230223-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
find_package(ncnn REQUIRED)

include_directories(${CMAKE_SOURCE_DIR}/libzmq/${ANDROID_ABI}/include)
link_directories(${CMAKE_SOURCE_DIR}/libzmq/${ANDROID_ABI}/lib)

add_library(
        ncnncomputervision SHARED
        cvncnn.cpp
        cv.cpp
        cv_ncnn.cpp
        mat_output.cpp
)

target_link_libraries(ncnncomputervision 
        ${OpenCV_LIBS}
        camera2ndk
        mediandk
        ncnn
        zmq
)

include(FetchContent)
FetchContent_Declare(
        googletest
        URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
set(Test_DIR ${CMAKE_SOURCE_DIR}/../../androidTest/cpp/jni)

enable_testing()

add_executable(
        UnitTest
        ${Test_DIR}/unittest.cpp
        cv_ncnn.cpp
        cv.cpp
        mat_output.cpp
)
target_link_libraries(
        UnitTest
        GTest::gtest_main
        GTest::gmock_main
        ${OpenCV_LIBS}
        ncnn
)

include(GoogleTest)
gtest_discover_tests(UnitTest)

这是我的 build.gradle 相关部分的摘录:

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"
    ndkVersion "21.4.7075529"

    defaultConfig {
        applicationId "com.applictation"
        minSdkVersion 26
        targetSdkVersion 30
        versionName getVersionName()
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                targets "UnitTest"
                cppFlags ''
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            testCoverageEnabled true
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    lintOptions {
        abortOnError false
    }

    externalNativeBuild {
        cmake {
            version '3.22.1'
            path file('src/main/jni/CMakeLists.txt')
        }
    }
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        resources.excludes.add("META-INF/*")
        jniLibs {
            pickFirsts += ['**']
        }
    }
    buildFeatures {
        viewBinding true
    }
}

我的 CMakeLists.txt 中是否缺少某些内容,或者我的 build.gradle 中可能缺少某些内容,这可能会导致它想要在 Windows 而不是手机上运行这些内容?

采取的步骤和完成的搜索:

在 golang 中运行单元测试错误:%1 不是有效的 win32 应用程序 按照答案之一的建议重新启动电脑,但没有解决。

如何解决“%1 不是有效的 Win32 应用程序”? 不相关,因为我的路径在 Windows 中并不混乱或混乱。我查看了环境变量。这也与 Visual Studio 无关。

为什么会出错? %1 不是有效的 Win32 应用程序 这里没有答案。而且我没有使用 python 代码,所以不太可能相关。

错误:java.io.IOException:CreateProcess 错误=193,%1 不是有效的 Win32 应用程序 卸载并重新安装 SDK 没有帮助。

无法运行程序“C:\Users dmin\AppData\Local\Android\Sdk\platform-tools db.exe”:CreateProcess 错误=193,%1 不是有效的 Win32 应用程序 提供与上面相同的解决方案,只是步骤更多。没有再表演。

在我的设备上的 Android Studio 中运行 Flutter 应用程序时出现错误:“ProcessException:%1 不是有效的 Win32 应用程序” 使缓存失效并重建。应该有同样的效果。从头开始重建项目是不可能的。

编辑:最近了解了 AndroidTest 和普通 Test 目录之间的区别,并澄清了测试所在的位置。

添加了关于 C++ 测试所在位置的说明。通过将测试移动到 Test 文件夹可以在短期内解决问题,但未来的一些测试可能需要 Android 子系统运行,这使得这是一个悬而未决的问题。

c++ android-studio cmake googletest arm64
1个回答
0
投票

这至少是问题的部分答案。

我首先发现了 Gradle 运行单元测试的原因,但没有发现为什么它选择在主机操作系统而不是手机上运行单元测试。在 CMakelists 中省略以下行将阻止执行单元测试,从而使您可以在方便时运行单元测试而不会破坏构建。

gtest_discover_tests(UnitTest)

我不会选择这个作为答案,因为这只是解决方案的一部分,而不是全部。

© www.soinside.com 2019 - 2024. All rights reserved.