我正面临一个问题,想知道为什么会这样。
我有一个由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_opengl
是JNI
。上面的脚本编译得很好但是当我将第8行include $(BUILD_SHARED_LIBRARY)
更改为include $(BUILD_STATIC_LIBRARY)
时,我开始收到有关Testing.cpp
中找不到的opengl方法的错误。
我的问题是为什么在shared library
的情况下,android能够找到opengl
相关方法的引用,为什么不将它更改为static library
?
答案 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)