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

Compiled GoggleTest on AndroidStudio gives not a Win32 application error when given a arm64 phone

提问人:Chthonic One 提问时间:11/10/2023 最后编辑:Chthonic One 更新时间:11/15/2023 访问量:41

问:

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

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:

这当然是真的。我为它提供了一个三星 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 应用程序按照其中一个答案的建议重新启动PC,但未解决。

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

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

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

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

在 Android Studio 中在我的设备上运行 Flutter 应用程序时出错:“ProcessException: %1 is not a valid Win32 application”失效和重建的缓存。应该有同样的效果。从头开始重建项目是不切实际的。

编辑:最近了解了AndroidTest和普通测试目录之间的区别,并阐明了测试的位置。

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

C++ android-studio cmake googletest arm64

评论

0赞 Olivier Samson 11/10/2023
你试过按照这个答案吗?stackoverflow.com/a/46448545/7623655
0赞 Chthonic One 11/10/2023
这就是我找到要添加的 gradle 代码的方式,但请注意,答案现在是 6 年了,gradle 版本已经过时了 4 个版本。我们现在使用的是 gradle 7.5。我不确定其中有多少仍然适用。此外,大多数 NDK 指令链接都已失效,因为在 android 端不再是这样做的。这些 Android.mk 文件是自动生成的。

答:

0赞 Chthonic One 12/1/2023 #1

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

我首先发现了导致 Gradle 运行单元测试的原因,但没有发现为什么它选择它们在主机操作系统而不是手机上运行它们。在 CMakelist 中省略以下行将阻止单元测试的执行,从而允许您在方便时运行单元测试,而不会中断生成。

gtest_discover_tests(UnitTest)

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