2013-07-18 15 views
10

共有ライブラリを構築したい。それを構築するには、別の共有ライブラリを呼び出す必要があります。ここに私がしたことがあります:共有ライブラリを構築して他のndkプログラムで呼び出す方法

1. "BuildLib"という名前の1つのAndroidプロジェクトを作成し、プロジェクトディレクトリの下に新しいフォルダ "jni"を追加します。 JNIフォルダの内容:

jni-->Android.mk
-->Application.mk
-->add.cpp
-->add.h add.cpp just do two numbers addition:

add.h:

int add(int a,int b);

add.cpp:

#include "add.h" 
int add(int a,int b){ 
    return a+b;} 

Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := add.cpp 
LOCAL_MODULE  := add 
include $(BUILD_SHARED_LIBRARY) 

プロジェクトをビルドした後、ディレクトリ$(BUILDLIB)/libs/armeabi/の下にlibadd.soがあります。

別のAndroidプロジェクト「CallLib」を作成します。 libadd.soadd.hをjniフォルダにコピーし、Android.mkApplication.mk、およびcall_add.cppを作成します。

Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := libadd.so 
LOCAL_MODULE := add_prebuilt 
include $(PREBUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
LOCAL_SRC_FILES := call_add.cpp 
LOCAL_MODULE  := native 
LOCAL_SHARED_LIBRARIES := add_prebuilt 
include $(BUILD_SHARED_LIBRARY) 

call_add.cpp:上記のすべての後に

#include "add.h" 
int call_add(){return add(1,2);} 

、私はCallLibプロジェクトをビルドしますが、エラーが発生しました:

undefined reference to 'add(int, int)';

は、私は思いますlibadd.soは見つかりませんでしたが、変更方法はわかりません。誰も私がこれをどのように修正できるか知っていますか?どんな助けもありがとう。 2番目Android.mk

+0

をあなたがコンパイルのためにEclipseを使用していましたか? 私はAndroidスタジオでこれに悩まされています。 Androidスタジオでこれを行う方法についてご意見がありましたら、お知らせください。 –

+0

関連:https://stackoverflow.com/questions/8358210/how-to-create-a-shared-library-in-android –

答えて

4

、を有する第1のモジュールを交換してください:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := libadd.so 
LOCAL_MODULE := add_prebuilt 
LOCAL_EXPORT_C_INCLUDES := add.h 
include $(PREBUILD_SHARED_LIBRARY) 

LOCAL_EXPORT_C_INCLUDESフラグadd_prebuiltモジュールにヘッダ情報を付加する必要があり、それは最終的なライブラリにリンクすることができます。

+0

返信いただきありがとうございます!私はあまりにも不注意です。 "PREBUILT_SHARED_LIBRARY"ではなく "PREBUILD_SHARED_LIBRARY"でなければなりません。上記のプロセスは、間違いを除いてまったく正しいです。 – user2591946

1

念のために誰がそれを必要とする:

幸せリンカを維持するためのビットハック方法:

LOCAL_LDLIBS := -llog 

または

LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -lMyStuff 

少ないハック:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := xyz 
LOCAL_SRC_FILES += xyz/xyz.c 
LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY) # this builds libxyz.so 


include $(CLEAR_VARS) 
LOCAL_MODULE := abc 
LOCAL_SHARED_LIBRARIES := xyz # <=== !!! this makes libabc.so dependent on libxyz.so 
LOCAL_SRC_FILES := abc/abc.c 
#LOCAL_LDLIBS := ... 
include $(BUILD_SHARED_LIBRARY) # this builds libabc.so 
関連する問題