3

こんにちは、長い投稿で申し訳ありません。https ://github.com/alisdair/jsmn-exampleからダウンロードした jsmn json ライブラリの一部である jsmn.c、json.c、および buf.c といういくつかの静的クラスをコンパイルしようとしています。 /ダウンロード.

私は 2 つの STATIC_LIBRARIES lib1 をコンパイルしており、json_librrary.lib1 には json_library に依存するネイティブ コードがあります。次に、2 つのライブラリを gnustl_static と lib1を含む共有ライブラリにしています。

私のフォルダ構造は次のとおりです

jni/lib1/ANandroid.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/アプリケーション.mk

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

したがって、lib1内には、 json_tokeniseという名前のjsonライブラリからメソッドを呼び出すクラスがあります

#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 の生成に失敗していることがわかります。

これに2日間費やしましたが、NDKは初めてです。

4

2 に答える 2

4

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

于 2012-10-27T02:36:04.290 に答える
0

同様の問題に直面しました。ビルド前の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/

最後に、モジュールが(prebuilt library)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)

このようにして、リンカーは各モジュールのメソッドのすべての定義を見つける場所を認識します。

于 2016-01-19T18:44:58.097 に答える