编译android-ndk代码时出现问题

时间:2011-08-03 08:29:50

标签: android c++ java-native-interface android-ndk

我正面临一个问题,想知道为什么会这样。

我有一个由Java文件和一些JNI & C++代码文件组成的项目。我正在通过JNI and C++构建cygwin代码,这是android ndk-tools的一部分。以下是我的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_openglJNI。上面的脚本编译得很好但是当我将第8行include $(BUILD_SHARED_LIBRARY)更改为include $(BUILD_STATIC_LIBRARY)时,我开始收到有关Testing.cpp中找不到的opengl方法的错误。

我的问题是为什么在shared library的情况下,android能够找到opengl相关方法的引用,为什么不将它更改为static library

2 个答案:

答案 0 :(得分:0)

共享库中所需的符号有时会在运行时查找。所以,我认为你遇到了同样的问题,但现在在运行时没有链接时间。查看共享库的代码是否运行。

答案 1 :(得分: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)