5

そのため、Android アプリケーションのネイティブ コードで libopus を使用しようとしています。私の Android.mk ファイルは次のようになります。

PLATFORM_PREFIX := /opt/android-ext/
LOCAL_PATH := $(PLATFORM_PREFIX)/lib

include $(CLEAR_VARS)

LOCAL_MODULE := libopus
LOCAL_SRC_FILES := libopus.a

include $(PREBUILT_STATIC_LIBRARY)

# I have to redeclare LOCAL_PATH because the library is in /opt/android-ext/
# and my project is somewhere else. Not very elegant.

LOCAL_PATH := /home/sergio/workspace/Project/jni

include $(CLEAR_VARS)

LOCAL_MODULE := opusUtilsNative
LOCAL_SRC_FILES := opusUtilsNative.c
LOCAL_C_INCLUDES += $(PLATFORM_PREFIX)/include
LOCAL_STATIC_LIBRARIES := android_native_app_glue libopus

include $(BUILD_SHARED_LIBRARY)

opusUtilsNative.c のコードは次のようになります。

#include "opusUtilsNative.h"
#include <opus/opus.h>
#include <opus/opus_types.h>

JNIEXPORT jbyteArray JNICALL Java_Project_OpusUtils_encode
  (JNIEnv * je, jclass jc, jbyteArray data){

    int rc;
    opus_int16 * testOutBuffer;
    unsigned char* opusBuffer;

    OpusDecoder *dec;

    dec = opus_decoder_create(48000, 2, &rc);
    return data;
}

そして、ビルドしようとすると、「opus_decoder_create」関数を使用する行を削除した場合にのみ正常に機能します。そうでなければ、私はこれを取得します:

error: undefined reference to 'opus_decoder_create'

opus_decoder_create が opus.h で明確に定義されていることがわかります。これは、その行を除外すると opus_int16 および OpusDecoder 宣言に関するエラーが発生するため、明らかに含まれています。含まれている定義と含まれていない定義があるのはなぜですか?

どんな助けでも大歓迎です。

4

3 に答える 3

5

これはトリッキーでした。少し掘り下げてみると、opusライブラリを正しくクロスコンパイルしておらず、結局ARMバイナリがないことに気づきました。

ライブラリが正しくクロスコンパイルされたかどうかを確認する良い方法:

cd /opt/android-ext/lib #Or wherever the .a file is
ar x libopus.a
file tables_LTP.o #Or any of the .o files generated by ar x

出力は次のようになります。

tables_LTP.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped

それ以外の場合は、クロスコンパイルプロセスを再確認することをお勧めします。

于 2013-01-21T21:57:17.643 に答える
0

キー ライブラリを 1 つ統合するのを忘れていました

LOCAL_LDLIBS := -lGLESv2

これで問題が解決しました。

于 2013-10-16T16:33:54.490 に答える
0

コンパイラからではなく、リンカからのエラーです。対応するライブラリへの参照をAndroid.mkファイルに追加するのを忘れた場合は、次のようにします。

LOCAL_LDLIBS += -lopus
于 2013-01-15T17:40:54.230 に答える