8

ライブラリLibXtractを共有オブジェクトlibxtract.soにコンパイルして成功し、2番目のプロジェクトで使用したいと思います。

言及プロジェクトでは、私はそれを単純な関数でコンパイルしようとします:

#include <com_androidnative1_NativeClass.h>
#include <android/log.h>
#include "libxtract.h"

JNIEXPORT void JNICALL Java_com_androidnative1_NativeClass_showText
(JNIEnv *env, jclass clazz)
{

    float mean = 0, vector[] = {.1, .2, .3, .4, -.5, -.4, -.3, -.2, -.1}, spectrum[10];
    int n, N = 9;
    float argf[4];

    argf[0] = 8000.f;
    argf[1] = XTRACT_MAGNITUDE_SPECTRUM;
    argf[2] = 0.f;
    argf[3] = 0.f;

    xtract[XTRACT_MEAN]((void *)&vector, N, 0, (void *)&mean);
    __android_log_print(ANDROID_LOG_DEBUG, "LIbXtract", "Button pushe2");
}

私は平らな構造をしています:

  • jni / com_androidnative1_NativeClass.c
  • jni / com_androidnative1_NativeClass.hjni / libxtract.h
  • libxtractインターフェースからのjni/other*.hファイル
  • jni / Android.mk
  • jni / Applicatoin.mk

ライブラリlibxtract.somainproject/libフォルダーに入れました

私のAndroid.mkファイルは次のようになります。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := com_androidnative1_NativeClass.c 
LOCAL_MODULE := com_androidnative1_NativeClass
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/
LOCAL_LDLIBS += -llog
LOCAL_SHARE_LIBRARIES := libxtract
NDK_MODULE_PATH += $(LOCAL_PATH)/../lib/
include $(BUILD_SHARED_LIBRARY)

それでもエラーが発生しました:

Compile thumb  : com_androidnative1_NativeClass <= com_androidnative1_NativeClass.c
SharedLibrary  : libcom_androidnative1_NativeClass.so./obj/local/armeabi/objs/com_androidnative1_NativeClass/com_androidnative1_Nativ    eClass.o: In function `Java_com_androidnative1_NativeClass_showText':
/home/jack/Projects/AndroidNative1/jni/com_androidnative1_NativeClass.c:20: undefined reference to `xtract'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libcom_androidnative1_NativeClass.so] Error 1

コードはLibXtractの例から来ており、C ++では問題なくコンパイルできます。アイデアはありますか?

4

3 に答える 3

5

Androidのmakeファイルは...

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LIB_PATH := $(LOCAL_PATH)/../lib
LOCAL_SRC_FILES := com_androidnative1_NativeClass.c 
LOCAL_MODULE := com_androidnative1_NativeClass
LOCAL_LDLIBS += -llog

LOCAL_LDLIBS + = $(LIB_PATH)-lxtract

LOCAL_SHARE_LIBRARIES := libxtract
include $(BUILD_SHARED_LIBRARY)

2番目のプロジェクトでこのmakeファイルを試してみてください。エラーが発生することなく、コードを正常にビルドできます。

于 2012-06-04T09:47:40.197 に答える
3

上記の答えでは、すべてが正しいですが、1つを除いて。

libをリンクしたい場合は、以下のようにdirのadd -L前に行う必要があります。LOCAL_LDLIBS

LIB_PATH := $(LOCAL_PATH)/../lib

LOCAL_LDLIBS += **-L**$(LIB_PATH) -lxtract

それ以外の場合は、以下のようなエラーが発生します

XXX /../ libを開くことができません:許可が拒否されました

于 2014-06-03T10:25:43.477 に答える
2

共有ライブラリについてAndroidNDKビルドスクリプトに通知する必要があります。これを行う方法の説明を確認${NDK}/doc/PREBUILTS.htmlしてください。彼らAndroid.mkはあなたがあなたを持っているのと同じディレクトリに追加することを勧めますlibXtract.so

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libXtract
LOCAL_SRC_FILES := libXtract.so
include $(PREBUILT_SHARED_LIBRARY)

ndk-buildデバッグのヒント: 「2番目のプロジェクト」のビルドに使用していると思います。で実行ndk-buildしてみてくださいV=99(試してみてくださいV=99 ndk-buildまたはndk-build V=99-私のメモリが失敗しています)。これにより、正確に失敗したリンクコマンドが表示されます。おそらくオプション-lXtractとが必要-L/path/to/libXtract/libraryです。(実際にビルド設定を修正する前に、リンクコマンドをコピーして貼り付けて手動で実行し、リンクを成功させるための適切なオプションを見つけると便利な場合があります。)

更新: @codetigerのコメントが同じ種類の回答を指しているように見えるようになりました(読みやすいNDKドキュメントについては言及していません-したがって、この回答を削除していません)。

于 2012-06-04T06:17:54.683 に答える