使用 zlib 的简单 android 二进制文件崩溃
Simple android binary crashing with zlib
我用 CMake 制作了一个简单的 android 可执行文件,它与 ndk 上的本机 zlib 链接。一切都正确编译,但在调用 deflateInit
时出现分段错误。
代码如下:
main.cpp
#include <iostream>
#include <zlib.h>
int main()
{
z_stream strm;
deflateInit(&strm, Z_DEFAULT_COMPRESSION);
std::cout << "it works!" << std::endl;
}
和对应的CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(zlib-on-android)
add_executable(main main.cpp)
find_package(ZLIB REQUIRED)
set_target_properties(main
PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_link_libraries(main PUBLIC ZLIB::ZLIB)
然后我用下面的命令编译:
cmake -H. -Bbuild -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=~/android-ndk-r17b -DCMAKE_ANDROID_STL_TYPE=c++_static -DCMAKE_SYSTEM_VERSION=16 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang
一切正常。然后我执行以下操作:
cd build
adb push main /data/local/tmp/.
adb shell
shell@device:/ $ cd /data/local/tmp
shell@device:/ $ ./main
[1] + Stopped (signal) ./main
有谁知道原因吗?我在尝试将 gdb 与这个可执行文件挂钩时遇到了很多麻烦。由于相同的代码适用于我的 Macosx,我无法理解为什么它不适用于 android.
编辑
出于某种原因,相同的代码在 Macosx 上崩溃(起作用的代码是相似的代码)。这是错误:bus error ./main
嗯,事实证明将 z_stream
设置为零可以解决问题。
#include <iostream>
#include <zlib.h>
#include <cstdlib>
int main()
{
z_stream strm;
std::memset(&strm, 0, sizeof(z_stream));
deflateInit(&strm, Z_DEFAULT_COMPRESSION);
std::cout << "it works!" << std::endl;
}
我用 CMake 制作了一个简单的 android 可执行文件,它与 ndk 上的本机 zlib 链接。一切都正确编译,但在调用 deflateInit
时出现分段错误。
代码如下:
main.cpp
#include <iostream>
#include <zlib.h>
int main()
{
z_stream strm;
deflateInit(&strm, Z_DEFAULT_COMPRESSION);
std::cout << "it works!" << std::endl;
}
和对应的CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(zlib-on-android)
add_executable(main main.cpp)
find_package(ZLIB REQUIRED)
set_target_properties(main
PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_link_libraries(main PUBLIC ZLIB::ZLIB)
然后我用下面的命令编译:
cmake -H. -Bbuild -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=~/android-ndk-r17b -DCMAKE_ANDROID_STL_TYPE=c++_static -DCMAKE_SYSTEM_VERSION=16 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang
一切正常。然后我执行以下操作:
cd build
adb push main /data/local/tmp/.
adb shell
shell@device:/ $ cd /data/local/tmp
shell@device:/ $ ./main
[1] + Stopped (signal) ./main
有谁知道原因吗?我在尝试将 gdb 与这个可执行文件挂钩时遇到了很多麻烦。由于相同的代码适用于我的 Macosx,我无法理解为什么它不适用于 android.
编辑
出于某种原因,相同的代码在 Macosx 上崩溃(起作用的代码是相似的代码)。这是错误:bus error ./main
嗯,事实证明将 z_stream
设置为零可以解决问题。
#include <iostream>
#include <zlib.h>
#include <cstdlib>
int main()
{
z_stream strm;
std::memset(&strm, 0, sizeof(z_stream));
deflateInit(&strm, Z_DEFAULT_COMPRESSION);
std::cout << "it works!" << std::endl;
}