共享库和 Android NDK
Shared library and Android NDK
我最近开始使用 Android NDK,我在使用共享库时遇到了一些问题。
我使用 Eclipse 创建了一个项目,允许我使用 NDK 和本地函数。但是现在,我想使用我用 QtCreator 创建的另一个共享库。
所以这是我的问题。是否可以将共享库包含到我的 NDK 项目中,即使我没有调用 ndk-build 来创建它?
让我们举个例子。如果我像这样创建一个简单的共享库:
g++ -Wall -shared -fPIC -o libapi.so MyDLL.cpp
我可以像这样在我的 NDK 项目中使用它吗 (Android.mk):
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := api
LOCAL_SRC_FILES := ../sharedLibs/libapi.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := dbapi
LOCAL_SRC_FILES := dbapi.cpp
LOCAL_C_INCLUDES += ../includes
LOCAL_SHARED_LIBRARIES := api
include $(BUILD_SHARED_LIBRARY)
当然,我可以在我的原生 NDK 端使用它的功能吗?
使用此方法,当我尝试构建我的 Eclipse 项目时遇到此错误:
/libs/armeabi-v7a/libapi.so: File format not recognized
我认为我的共享库与 ndk-build 不兼容(对,错?)。
谢谢你的回答。
您是如何构建共享库的?它是用 NDK 为 arm 编译的吗?
否则无法正常工作。
评论中的人表示您几乎肯定是为 x86 而不是 arm 编译的。 (你说你正在使用带 Windows 的 cygwin,默认情况下它将编译为 x86,除非你的 windows 盒子是一个手臂盒子,我猜不是这种情况。)
在 Android ndk 中有一个名为 make-standalone-toolchain.sh 的脚本。如果您在安装 ndk 的当前目录中,则可以通过键入以下内容来使用它:
./android-ndk-r9/build/tools/make-standalone-toolchain.sh --platform=<your desired android platform> --install-dir=<location where you want android toolchain>
这将创建一组构建工具,您可以使用这些工具将 arm 二进制文件构建到您设备上的 运行。这些工具将被命名为例如
arm-linux-androideabi-gcc
将这些工具放在您的路径中并使用它们来构建您的库。
我不知道 cygwin 是否包含 "file" 命令,但您可以通过键入以下内容来确定共享库的体系结构:
file libapi.so
如果它说是手臂,那你就很好。如果它显示 x86,它将无法工作(除了在 x86 android 设备上,即)。
我最近开始使用 Android NDK,我在使用共享库时遇到了一些问题。
我使用 Eclipse 创建了一个项目,允许我使用 NDK 和本地函数。但是现在,我想使用我用 QtCreator 创建的另一个共享库。
所以这是我的问题。是否可以将共享库包含到我的 NDK 项目中,即使我没有调用 ndk-build 来创建它?
让我们举个例子。如果我像这样创建一个简单的共享库:
g++ -Wall -shared -fPIC -o libapi.so MyDLL.cpp
我可以像这样在我的 NDK 项目中使用它吗 (Android.mk):
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := api
LOCAL_SRC_FILES := ../sharedLibs/libapi.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := dbapi
LOCAL_SRC_FILES := dbapi.cpp
LOCAL_C_INCLUDES += ../includes
LOCAL_SHARED_LIBRARIES := api
include $(BUILD_SHARED_LIBRARY)
当然,我可以在我的原生 NDK 端使用它的功能吗?
使用此方法,当我尝试构建我的 Eclipse 项目时遇到此错误:
/libs/armeabi-v7a/libapi.so: File format not recognized
我认为我的共享库与 ndk-build 不兼容(对,错?)。
谢谢你的回答。
您是如何构建共享库的?它是用 NDK 为 arm 编译的吗? 否则无法正常工作。
评论中的人表示您几乎肯定是为 x86 而不是 arm 编译的。 (你说你正在使用带 Windows 的 cygwin,默认情况下它将编译为 x86,除非你的 windows 盒子是一个手臂盒子,我猜不是这种情况。)
在 Android ndk 中有一个名为 make-standalone-toolchain.sh 的脚本。如果您在安装 ndk 的当前目录中,则可以通过键入以下内容来使用它:
./android-ndk-r9/build/tools/make-standalone-toolchain.sh --platform=<your desired android platform> --install-dir=<location where you want android toolchain>
这将创建一组构建工具,您可以使用这些工具将 arm 二进制文件构建到您设备上的 运行。这些工具将被命名为例如
arm-linux-androideabi-gcc
将这些工具放在您的路径中并使用它们来构建您的库。
我不知道 cygwin 是否包含 "file" 命令,但您可以通过键入以下内容来确定共享库的体系结构:
file libapi.so
如果它说是手臂,那你就很好。如果它显示 x86,它将无法工作(除了在 x86 android 设备上,即)。