- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 android NDK 上进行开发。我实际上有一个带有模块的项目+子文件夹(编译为静态库)并与主项目文件(libs .a + main object .o --> 可执行文件)链接在一起。一切都通过 ndk-build 完成。
我正在尝试使用构造函数,在挖掘了几个小时之后,我发现只要不调用该库 (.o) 的函数,就不会调用构造函数。
例如
__attribute__ ((__constructor__))
void pre_func(void) {
printf("pre_func2\n");
}
void my_init(){
printf ("tutto funge!");
//return 0;
}
仅当(和之前)my_init();
在 test.c
中显式调用时调用
$ adb shell /data/local/tmp/test
pre_func2
tutto funge!
现在,我的问题很简单。通过体系结构,我需要一些模块,我准备在加载对象时对其进行初始化...我搜索了几个东西 (--init, _init())
它们都没有帮助。
由于标准 linux 上的相同代码(glibc 和无仿生链接器)
看起来工作正常,我的编译 gcc 语句中是否有问题避免了构造函数在 .a 加载时执行?我该如何解决?
编译拇指:
modules <= libtest.c
/opt/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm- linux-androideabi-gcc -MMD -MP -MF ./obj/local/armeabi/objs/modules/libtest.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Ijni/modules -DANDROID -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -Wa,--noexecstack -I/opt/android-ndk-r8e/platforms/android-3/arch-arm/usr/include -c jni/modules/libtest.c -o ./obj/local/armeabi/objs/modules/libtest.o
StaticLibrary : libmodules.a
rm -f obj/local/armeabi/libmodules.a
/opt/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar crs ./obj/local/armeabi/libmodules.a ./obj/local/armeabi/objs/modules/libtest.o ./obj/local/armeabi/objs/modules/module.o
最佳答案
我猜问题是如果一些 .o
不是从 test.c 调用的,它就不会链接到 test 可执行文件中。这就是类轮对待静态库(.a
文件)的方式。要强制所有编译单元(又名 .o
文件)出现在可执行文件中,请使用
-Wl,-whole-archive libmodules.a -Wl,-no-whole-archive
用于建筑。您可以通过指定在 NDK 中实现此目的
LOCAL_WHOLE_STATIC_LIBRARIES := modules
但我必须承认,我从未用 $(BUILD_EXECUTABLE)
尝试过这个。它适用于 $(BUILD_SHARED_LIBRARY)
。如果出现问题,只需写
LOCAL_LDFLAGS := -Wl,-whole-archive $(PATH_TO_LIBMODULES)/libmodules.a -Wl,-no-whole-archive
并且不要忘记正确设置 PATH_TO_LIBMODULES
。
关于android - __attribute__ ((__constructor__)) 在安卓中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284751/
我正在尝试在 android NDK 上进行开发。我实际上有一个带有模块的项目+子文件夹(编译为静态库)并与主项目文件(libs .a + main object .o --> 可执行文件)链接在一起
我在谷歌上进行了大量搜索以获得明确的答案,但找不到。 我们有 iOS 应用程序需要使用的跨平台源。我已经将它们打包为静态框架,并获得了一个测试应用程序来成功链接并对其进行调用。 我遇到的问题是它大量使
我是一名优秀的程序员,十分优秀!