Проблема в компиляции кода Android-ndk - PullRequest
3 голосов
/ 03 августа 2011

Я столкнулся с проблемой и хотел бы знать, почему это происходит.

У меня есть проект, который состоит из файла 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), я начинаю получать сообщение об ошибках методов opengl, которых нет в Testing.cpp.

Мой вопрос: почему в случае shared library Android может найти ссылки на метод opengl и почему нет, когда я изменяю его на static library?

Ответы [ 2 ]

0 голосов
/ 01 января 2012

Не думаю, что вам нужно:

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)
0 голосов
/ 03 августа 2011

Символы, необходимые в разделяемых библиотеках, иногда ищутся во время выполнения.Итак, я думаю, что вы столкнулись с той же проблемой, но теперь во время выполнения не время соединения.Посмотрите, работает ли код с общей библиотекой.

...