1

libxxx.so.3.3 という名前の共有ライブラリ (.so) をプリコンパイルしました。コンパイル後の名前が「libxxx.so.3.3」だった理由はわかりません。JNI経由でAndroidアプリで使用したいと思います。このために、ndk モジュール xxx_jni を作成しました。

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := xxx
LOCAL_SRC_FILES := xxx.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := xxx_jni
LOCAL_SRC_FILES := xxx_wrapper.c
LOCAL_SHARED_LIBRARIES := xxx
LOCAL_C_INCLUDES := /softdev/xxx/host/include/

include $(BUILD_SHARED_LIBRARY)

ndk-build が libxxx_jni.so のコンパイルに失敗したため、 「. so.3.3」の名前を「 .so 」に変更する必要がありました。

Android NDK: ERROR:/Users/user/Documents/dev/src/xxx_jni/jni/Android.xxx: LOCAL_SRC_FILES should point to a file ending with ".so"    
Android NDK: The following file is unsupported: libxxx.so.3.3    

私のラッパークラス(JNI用):

#include "xxx_wrapper.h"
#include <xxx-c/Index.h> // include "xxx" library header

#ifndef _Included_name_antonsmirnov_android_xxx_wrapper
#define _Included_name_antonsmirnov_android_xxx_wrapper
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     name_antonsmirnov_android_xxx_wrapper
 * Method:    exec_test
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_name_antonsmirnov_android_xxx_1wrapper_exec_1test(JNIEnv *, jobject, jstring)
{
    // using method from "xxx" library
    xxx_method();

    return 7;
}

そのため、ndk のコンパイル (ndk-build) の後、「libs/armeabi」フォルダーに libxxx.so と libxxx_jni.so という 2 つの削除されたファイルがあります。

次に、ラッパークラスの実行時にライブラリをロードしようとします:

public class xxx_wrapper {

    static {
        System.loadLibrary("xxx");
        System.loadLibrary("xxx_jni"); // error here!
    }

エラー:

at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1891]:   167 could not load needed library 'libxxx.so.3.3' for 'libxxx_jni.so' (load_library[1093]: Library 'libxxx.so.3.3' not found)

「.so.3.3」拡張子とシンボリックリンク「.so」->「.so.3.3」を残そうとしましたが、同じ結果になりました。私が理解している限り、問題は xxx_wrapper lib がまだ ".so.3.3" ライブラリをロードしたいのですが、それは ".so" です。

4

1 に答える 1

1

プリコンパイルされたライブラリが ndk-build を使用してコンパイルされていない可能性はありますか? Android パッケージ マネージャー (およびビルダー!) は、サフィックスとしてバージョン番号を持つ .so ファイルを処理できません。

これは、次のいずれかで克服できます。

ソースがある場合は、ndk-build を使用してライブラリを再コンパイルします (新しい makefile を作成することを意味します)。

または:

ライブラリをアセットとして .apk ファイルに埋め込みます。アプリが起動したら、これらのアセットをアプリケーション データ フォルダーに保存します。今、あなたは使用することができます

System.load( "/path/to/lib/libxxx.so.3.3" );

アプリ内に埋め込まれているライブラリではなく、システム パスを使用してファイルを指しているため、失敗することはありません。これは、アプリケーションがデバイス上のより多くのストレージを消費することを意味しますが、ライブラリを再コンパイルできない場合 (そして誰も適切な解決策を知りません!)、これは回避策になる可能性があります。

于 2013-10-03T14:30:23.790 に答える