17

Android アプリでネイティブ コードを使用しています。まず、私は1つのライブラリしか使用していませんでした。そのため、すべてがうまくいきました。しかし今、もう 1 つのライブラリをそれに統合する必要があります。プロジェクトの jni フォルダーの理想的な構造がどうあるべきかわかりません (コード全体を配置する場所など)。回避策を見つけました。jni .ie library1 と library2 内に 2 つのフォルダーを作成しました。両方のフォルダー内に jni フォルダーを再度作成し、それぞれのコードをフォルダーに配置しました。

コンプしてもらいました。両方の .so ファイルが生成されていますが、アプリケーションで使用できません。System.loadLibrary("library1.so"); を使用してライブラリをロードできません。また、フルパスを提供しようとしました。しかし失敗した

また、親 jni フォルダーの Android.mk ファイル内に何を書き込むべきかわかりません。

現在の構造: project_folder -> jni -> library1 -> jni -> "source code" Android.mk はここに書かれています project_folder -> jni -> library2 -> jni -> "source code" Android.mk はここに書かれています

更新#1:

Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
make: *** No rule to make target `jni/zap/jni/zap/zap/error.c', needed by `obj/local/armeabi/objs-debug/zap/jni/zap/zap/error.o'.  Stop.

私は Application.mk を使用していません。これは私の Android.mk です:

TOP_PATH := $(call my-dir)

# Build library 1
include $(CLEAR_VARS)
LOCAL_PATH := $(TOP_PATH)/zap
LOCAL_MODULE := zap
LOCAL_C_INCLUDES := $(LOCAL_PATH)/zap
LOCAL_SRC_FILES := $(LOCAL_PATH)/zap/error.c \
$(LOCAL_PATH)/zap/hello-jni.c \
$(LOCAL_PATH)/zap/zap.c \
$(LOCAL_PATH)/zap/zapd.c \
$(LOCAL_PATH)/zap/zaplib.c 
include $(BUILD_SHARED_LIBRARY)
4

2 に答える 2

21

私が見つけた最良の構造は、jni/ フォルダーを ndk-build makefile のみに使用し、ソースを外部の独自のフォルダーに保持することです。これは、jni の下でツリーを再構築することなく、既存のプロジェクトに簡単に追加できます。

ただし、LOCAL_PATH 変数の処理方法と $(call my-dir) の使用には注意が必要です。これが実際の例です:

  • 私のプロジェクト/
    • ライブラリ1/
      • source1.cpp
    • ライブラリー2/
      • source2.cpp
    • jni/
      • Android.mk
      • アプリケーション.mk

Android.mk:

# TOP_PATH refers to the project root dir (MyProject)
TOP_PATH := $(call my-dir)/..

# Build library 1
include $(CLEAR_VARS)
LOCAL_PATH := $(TOP_PATH)/library1
LOCAL_MODULE := library1
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := source1.cpp
include $(BUILD_SHARED_LIBRARY)

# Build library 2
include $(CLEAR_VARS)
LOCAL_PATH := $(TOP_PATH)/library2
LOCAL_MODULE := library2
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := source2.cpp
include $(BUILD_SHARED_LIBRARY)

必要に応じて、Android.mk のセクションを独自の makefile に分割できます。

于 2013-01-25T06:26:03.887 に答える