编译Android NDK代码出现问题

3

我遇到了一个问题,想知道为什么会出现这种情况。

我的项目包含一个 Java 文件和一些 JNI & C++ 代码文件。我通过 cygwin 构建 JNI 和 C++ 代码,它是安卓 NDK 工具的一部分。下面是我的 Android.mk 文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := cube
LOCAL_CFLAGS := -DANDROID_NDK
LOCAL_SRC_FILES := Testing.cpp
LOCAL_LDLIBS := -lGLESv1_CM
include $(BUILD_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := jni_opengl
LOCAL_SRC_FILES := jni_openglcube.cpp
LOCAL_SHARED_LIBRARIES := cube
include $(BUILD_SHARED_LIBRARY)

在上述脚本中,cube 模块是用标准的 C++ 编写的,执行了一些 opengl 操作,而 jni_opengl 则是使用 JNI 编写的。以上脚本编译正常,但当我将第8行的 include $(BUILD_SHARED_LIBRARY) 改为 include $(BUILD_STATIC_LIBRARY) 时,开始出现关于 Testing.cpp 中未找到 opengl 方法的错误。
我的问题是:为什么在使用 共享库 的情况下,安卓能够找到与 opengl 相关的方法引用,而在我改用 静态库 后却无法找到呢?
2个回答

0
共享库中需要的符号有时会在运行时查找。因此,我认为您现在遇到了相同的问题,但是是在运行时而不是链接时。请尝试运行带有共享库的代码。

0

我认为你不需要:

LOCAL_LDLIBS := -lGLESv1_CM

用于你的静态库。

您需要将其移动到共享库部分。静态部分不需要它也可以正常运行。

不要忘记更改:

LOCAL_SHARED_LIBRARIES := cube

LOCAL_STATIC_LIBRARIES := cube

静态库只是一堆.o文件附加在一起,因此它不会像共享库那样被“链接”。

你的最终Android.mk应该长这样:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libcube
LOCAL_CFLAGS := -DANDROID_NDK
LOCAL_SRC_FILES := Testing.cpp
include $(BUILD_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := jni_opengl
LOCAL_SRC_FILES := jni_openglcube.cpp
LOCAL_STATIC_LIBRARIES := libcube
LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog
include $(BUILD_SHARED_LIBRARY)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接