Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在为android编译C库,但未找到符号_Android_C_Android Ndk_Java Native Interface_Static Libraries - Fatal编程技术网

正在为android编译C库,但未找到符号

正在为android编译C库,但未找到符号,android,c,android-ndk,java-native-interface,static-libraries,Android,C,Android Ndk,Java Native Interface,Static Libraries,我正在尝试为android编译一个简单的C库,但是生成的库不包含任何符号/对象!我正在使用nm命令检查库 这是Android.mk: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := my_lib_static LOCAL_MODULE_FILENAME := libmylib LOCAL_C_INCLUDES := $(LOCAL_PATH) LOCAL_SRC_FILES := File1.c File

我正在尝试为android编译一个简单的C库,但是生成的库不包含任何符号/对象!我正在使用
nm
命令检查库

这是Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := my_lib_static
LOCAL_MODULE_FILENAME := libmylib

LOCAL_C_INCLUDES := $(LOCAL_PATH)

LOCAL_SRC_FILES := File1.c File2.c 

include $(BUILD_SHARED_LIBRARY)
# or include $(BUILD_STATIC_LIBRARY)
编辑

将创建一个名为“objs”的子文件夹,其中包含所有符号

编辑

这是
gobjdump
的输出:

MyLibBot.o:     file format elf32-littlemips

gobjdump: MyLibBot.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols



MyLibCommon.o:     file format elf32-littlemips

gobjdump: MyLibCommon.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols



MyLibGameLogic.o:     file format elf32-littlemips

gobjdump: MyLibGameLogic.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols



MyLibUndoStack.o:     file format elf32-littlemips

gobjdump: MyLibUndoStack.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols

如果要显示动态符号,必须将-D标志指定为nm

您还可以使用-T标志来objdump

您应该使用ndk中提供的nm或objdump版本,而不是任何可能用于管理开发主机库的版本。这些将被发现埋在ndk的工具链/文件夹下,并带有前缀名称,例如
arm-linux androideabi-nm

例如,(在一个我已经有一段时间没有用于Android工作的系统上,因此包含一个过时的版本-您必须使用一些独创性来找到适用于您的系统的内容):


我也有类似的问题。您可以使用自定义构建进行变通,以便将-lotherlib作为最终参数传递。例如:

$ /path/to/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \
--sysroot=/path/to/platforms/android-19/arch-arm \
-L/usr/local/src/lua-5.1.5/src -shared -lm -o mylibrary.so milibrary.o \
-lotherlib

我不是一个C专家,所以我花了好几天的时间才弄明白:p,不确定为什么-我应该走到最后…

听起来这个库好像被剥夺了。如果将要导出为JNIEXPORT的函数声明为JNIEXPORT,会发生什么情况?即使你不打算通过JNI给他们打电话,这也会让他们保留下来。或者你可以查看NDK是如何定义的,然后自己做一些类似的事情。如果真的卡住了,从NDK示例中构建hello jni,然后复制它,并将它一点一点地变形到您的项目中,直到它崩溃,这时您将意识到问题所在。@ChrisStratton我已经查看了示例,这就是我构建这个库的方式。这就是为什么我建议将样本的测试副本修改到您的项目中,直到您发现差异,使其无法正确构建。我不知道“gojdump”是什么,但它不是您应该使用的工具。您应该使用ndk中提供的体系结构os abi前缀版本的nm或objdump,分别带有-D或-T标志,来检查.so文件。
find~/Developer/Libs/android/android-ndk-r9d-name“*nm”
Ah,这是一个额外的问题,您必须使用ndk中提供的这些工具的版本,不是为管理主机上的库而提供的。好的,我按照您的建议做了。正在更新问题。无论是clang还是gcc,都要尝试。.so文件格式至少必须兼容,否则在设备上无法工作。是的,我意识到了这一点。。。我只是因为这个问题而感到压力太大。。。符号在那里,所以链接没有发生,我猜。确保设备上的文件的当前版本正在解包,三次检查所寻求的函数名与库提供的函数名,记住所有java包前缀,注意非法字符,等等。
$ /path/to/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \
--sysroot=/path/to/platforms/android-19/arch-arm \
-L/usr/local/src/lua-5.1.5/src -shared -lm -o mylibrary.so milibrary.o \
-lotherlib