android ndk неопределенная ссылка на метод

Привет, извините за длинный пост, я пытаюсь скомпилировать некоторые статические классы, а именно jsmn.c, json.c и buf.c, которые являются частью библиотеки jsmn json, которую я скачал с https://github.com/alisdair/jsmn-example/downloads.

Я компилирую два STATIC_LIBRARIES lib1, и json_librrary.lib1 имеет нативный код, который зависит от json_library. Затем я делаю две библиотеки в общую библиотеку, содержащую gnustl_static AND lib1

Моя структура папок выглядит следующим образом

JNI /lib1/ANdroid.mk

include $(CLEAR_VARS)
LOCAL_MODULE := json_library
LOCAL_SRC_FILES := /3rdParty/jsmn/json_library.a
LOCAL_SRC_FILES := /3rdParty/jsmn/jsmn.c /3rdParty/jsmn/buf.c /3rdParty/jsmn/log.c /3rdParty/jsmn/json.c 
LOCAL_C_INCLUDES := /3rdParty/jsmn/jsmn.h /3rdParty/jsmn/buf.h /3rdParty/jsmn/log.h /3rdParty/jsmn/json.h 
# Optional compiler flags.
LOCAL_LDLIBS   = -lz -lm
LOCAL_CFLAGS   = -Wall -pedantic -std=c99 -g
include $(BUILD_STATIC_LIBRARY)

  include $(CLEAR_VARS)
  # Module Name
  LOCAL_MODULE    := lib1
  LOCAL_STATIC_LIBRARIES := json_library
  ........
  .......
  ......
  include $(BUILD_STATIC_LIBRARY)

JNI /Android.mk

# Here we give our module name
LOCAL_MODULE    := lib2
# list the static modules included here!!!
LOCAL_STATIC_LIBRARIES :=   gnustl_static  lib1 
....
include $(BUILD_SHARED_LIBRARY)

JNI /Application.mk

APP_MODULES   :=  lib2
# Optimization for release
APP_OPTM := release
#Targets
APP_ABI := armeabi-v7a armeabi

Так что внутри lib1 у меня есть класс, который вызывает метод из библиотеки json с именем json_tokenise

#include <string.h>
#include <stdio.h>
 #include <stdlib.h>
 #include <jsmn/jsmn.h>
#include <jsmn/json.h>
#include <jsmn/buf.h>

jsmntok_t *tokens=json_tokenise((char *)data);

typedef enum {
START,
WRAPPER,
MESSAGE,
ROUTE,
OBJECT,
ARRAY,
SKIP,
STOP
}parse_state;

Я получаю следующую ошибку

undefined reference to `json_tokenise(char*)'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi-v7a/lib2.so] Error 1

**** Build Finished ****

Когда я заглядываю внутрь [obj/local/armeabi-v7a/ /, я вижу, что libjson_library.a liblib1.a libgnustl_static.a генерируется для armabi-v7, и он не может сгенерировать lib2 из-за ошибки.

Пожалуйста, помогите или направьте меня, где я иду неправильно, я потратил два дня на это, и я новичок в NDK.

2 ответа

Вы должны исправить jni/lib1/Android.mk файл:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := json_library
LOCAL_SRC_FILES := 3rdParty/jsmn/jsmn.c 3rdParty/jsmn/buf.c 3rdParty/jsmn/log.c 3rdParty/jsmn/json.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/3rdParty/jsmn
# Optional compiler flags.
LOCAL_LDLIBS   = -lz -lm
LOCAL_CFLAGS   = -Wall -pedantic -std=c99 -g
include $(BUILD_STATIC_LIBRARY)

Если после этого у вас все еще есть проблемы, пожалуйста, запустите ndk-build с параметром V=1 в командной строке и опубликовать полный вывод этой сборки и полное содержимое всех ваших Android.mk файлы.

Я столкнулся с подобной проблемой. json_library.a должен быть включен в предварительно собранный модуль статической библиотеки. И это должно быть скомпилировано для желаемой платформы.

include $(CLEAR_VARS)
LOCAL_MODULE := json_core
LOCAL_SRC_FILES := /3rdParty/jsmn/json_library.a
include $(PREBUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := json_library
LOCAL_SRC_FILES := /3rdParty/jsmn/jsmn.c /3rdParty/jsmn/buf.c /3rdParty/jsmn/log.c /3rdParty/jsmn/json.c 

Нет необходимости включать каждый файл отдельно.

LOCAL_C_INCLUDES := /3rdParty/jsmn/

Наконец, необходимо указать, что json_library модуль зависит от json_core (готовая библиотека) .

LOCAL_STATIC_LIBRARIES := json_core 
# Optional compiler flags.
LOCAL_LDLIBS   = -lz -lm
LOCAL_CFLAGS   = -Wall -pedantic -std=c99 -g
include $(BUILD_STATIC_LIBRARY)

Таким образом, компоновщик знает, где найти все определения методов для каждого модуля.

Другие вопросы по тегам