2

私のAndroidプロジェクトは、ネイティブコードを持つAndroidライブラリプロジェクトを使用しておりUnsatisifiedLinkError、ライブラリが使用するネイティブ関数からを取得しています。

プロジェクトのAndroid.mkファイルに、ライブラリが使用するこれらの共有オブジェクトを含めました。これらの共有オブジェクトは、/libsビルド時にEclipseプロジェクトのディレクトリに正しくコピーされ、実行時にapks/libディレクトリに存在します。見つからないメソッドは、libVuforiaTracking.soにあるはずです。

これが私のAndroid.mkファイルです:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := QCAR-prebuilt
LOCAL_SRC_FILES = ../../VuforiaTracking/libs/$(TARGET_ARCH_ABI)/libQCAR.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := VuforiaTracking-prebuilt
LOCAL_SRC_FILES = ../../VuforiaTracking/libs/$(TARGET_ARCH_ABI)/libVuforiaTracking.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := MyProject

# The list of shared libraries *modules* this module depends on at runtime.
# This is necessary at link time and to embed the corresponding information
# in the generated file. We reference the prebuilt library defined earlier 
# in this makefile.
LOCAL_SHARED_LIBRARIES := QCAR-prebuilt VuforiaTracking-prebuilt

#LOCAL_SRC_FILES := MyProject.cpp

# By default, ARM target binaries will be generated in 'thumb' mode, where
# each instruction are 16-bit wide. You can define this variable to 'arm'
# if you want to force the generation of the module's object files in
# 'arm' (32-bit instructions) mode
LOCAL_ARM_MODE := arm

include $(BUILD_SHARED_LIBRARY)

そして、ここにログメッセージがあります:

12-21 09:53:48.220: E/AndroidRuntime(13086): FATAL EXCEPTION: main
12-21 09:53:48.220: E/AndroidRuntime(13086): java.lang.UnsatisfiedLinkError: Native method not found: com.qualcomm.QCARSamples.ImageTargets.VuforiaTrackingActivity.getOpenGlEsVersionNative:()I
12-21 09:53:48.220: E/AndroidRuntime(13086):    at com.qualcomm.QCARSamples.ImageTargets.VuforiaTrackingActivity.getOpenGlEsVersionNative(Native Method)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at com.qualcomm.QCARSamples.ImageTargets.VuforiaTrackingActivity.getInitializationFlags(VuforiaTrackingActivity.java:293)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at com.qualcomm.QCARSamples.ImageTargets.VuforiaTrackingActivity.onCreate(VuforiaTrackingActivity.java:282)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at android.app.Activity.performCreate(Activity.java:5191)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at android.os.Looper.loop(Looper.java:137)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at android.app.ActivityThread.main(ActivityThread.java:4898)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at java.lang.reflect.Method.invokeNative(Native Method)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at java.lang.reflect.Method.invoke(Method.java:511)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
12-21 09:53:48.220: E/AndroidRuntime(13086):    at dalvik.system.NativeStart.main(Native Method)

これは、ライブラリ依存関係の共有オブジェクトを含める正しい方法ですか?

編集:

パッケージ名にあることに気づきましたcom.qualcomm.QCARSamples.ImageTargets.VuforiaTrackingActivity。プロジェクトでライブラリのこのアクティビティをサブクラス化しているため、実際のアクティビティのパッケージ名は異なることに注意してください。JNIがという名前のメソッドを探しに行きcom.qualcomm.QCARSamples.ImageTargets.VuforiaTrackingActivity.getOpenGlEsVersionNative()、私のサブクラスに名前が付けられている場合、これにより問題が発生しcom.my.package.MyActivityますか?

4

1 に答える 1

2

問題は、ネイティブメソッドを使用するクラスの名前をVuforiaTrackingActivity、ネイティブメソッドが呼び出されたときの名前に変更したことVuforiaTrackingです。したがって、共有オブジェクトは実際には正しくロードされており、ネイティブメソッド名のベースとなっている基本クラスを拡張することは問題ではありませんでした。com.qualcomm.QCARSamples.ImageTargets.VuforiaTracking.openGlEsVersionNativeメソッドをに変更するcom.qualcomm.QCARSamples.ImageTargets.VuforiaTrackingActivity.openGlEsVersionNativeと、すべてがそれに応じて機能します。

于 2012-12-21T16:23:13.100 に答える