2011-08-03 60 views
3

我正面临一个问题,并想知道为什么会发生这种情况。编译android-ndk代码时出现问题

我有它由一个Java文件和一些JNI & C++代码文件的项目。我正在通过cygwin构建JNI and C++代码,它是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

我不认为你需要有:

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)