相关疑难解决方法(0)

如何将-fvisibility选项应用于静态库中的符号?

我有一个共享库项目,它由4个静态库(.a)和一个object(.o)文件构成.我正在尝试添加-fvisibility=hidden选项以将输出中的符号限制为仅使用__attribute__在源中标记的符号.

我已经-fvisibility=hidden.so项目的编译选项(包括.o文件)和项目添加了选项.a.

目标文件中的符号将按照预期从最终中删除.so.但是,.a项目中的符号仍然在最终.so文件中.将-fvisibility=hidden选项添加到.solink命令无效.

我究竟做错了什么?

我的目的是从.so除了接口函数之外的所有符号中删除库.

编辑:我实际上使用版本地图来解决这个问题.但是,随着外部符号的更改,它需要继续维护版本脚本.接受的答案有更好的主意.

gcc visibility static-libraries

43
推荐指数
3
解决办法
3万
查看次数

何时在Android NDK中使用JNIEXPORT和JNICALL?

我正在尝试编写自己的jni源代码.看一些ndk示例,我发现他们经常使用那些宏JNIEXPORT和JNICALL,这些宏的名字跟java包一样

JNIEXPORT void JNICALL Java_com_example_plasma_PlasmaView_renderPlasma(JNIEnv * env, jobject obj, jobject bitmap, jlong time_ms)

我用Google搜索,但我无法理解何时以及如何使用这些宏

c++ macros java-native-interface android android-ndk

26
推荐指数
3
解决办法
2万
查看次数

Clang 不会剥离本地静态库的符号

使用Android NDK r18b(使用clang工具链)和Android Studio 3.2.1.

我的相关部分mylib.gradle

task ndkBuild(type: Exec) {
    commandLine "${ndkDir}/ndk-build${ndkExt}"
}
Run Code Online (Sandbox Code Playgroud)

我的Application.mk

APP_PLATFORM := android-17
APP_ABI := armeabi-v7a
# APP_OPTIM := release
APP_CFLAGS += -D_BSD_SOURCE
Run Code Online (Sandbox Code Playgroud)

和我的相关部分Android.mk

include $(CLEAR_VARS)

LOCAL_PATH := $(BASE_PATH)
LOCAL_MODULE := mylib_jni

LOCAL_STATIC_LIBRARIES := \
  lib1 \
  lib2

LOCAL_WHOLE_STATIC_LIBRARIES := \
  mylib_wrap \
  other_wrap

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

静态库mylib_jni.so构建成功。然后我运行以下命令(来自 NDK):

arm-linux-androideabi-readelf -a mylib_jni.so


未剥离的符号

在输出中,我可以看到lib1and中所有非静态方法的名称lib2(不是上面可以看到的整个库)。这怎么可能?如何从ndk-build …

clang android-ndk

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