android - 包括库在Android项目中使用的共享对象

标签 android makefile unsatisfiedlinkerror

我的 Android 项目正在使用具有 native 代码的 Android 库项目,并且我从该库使用的 native 函数中收到 UnsatisifiedLinkError

我已将库使用的这些共享对象包含在项目的 Android.mk 文件中,并且当我构建并存在时,它们会正确复制到 Eclipse 项目的 /libs 目录中当我运行时,在 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,我可能应该注意到我正在项目中对库的此 Activity 进行子类化,因此实际 Activity 会有所不同。当 JNI 查找名为 com.qualcomm.QCARSamples.ImageTargets.VuforiaTrackingActivity.getOpenGlEsVersionNative() 的方法并且我的子类名为 com.my.package.MyActivity 时,这会导致任何问题吗?

最佳答案

问题是,当调用 native 方法 VuforiaTracking 时,我将使用 native 方法的类的名称更改为 VuforiaTrackingActivity。因此,共享对象实际上已正确加载,并且我扩展 native 方法名称所基于的基类并不重要。我将方法 com.qualcomm.QCARSamples.ImageTargets.VuforiaTracking.openGlEsVersionNative 更改为 com.qualcomm.QCARSamples.ImageTargets.VuforiaTrackingActivity.openGlEsVersionNative 并且一切都相应地工作。

关于android - 包括库在Android项目中使用的共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13993004/

相关文章:

github - 通过 Travis-CI 在 Go 中作为版本的 Git 标签名称

java - 使用 native 代码时出错

java - UnsatisfiedLinkError: org.opencv.highgui.Highgui.imread_0 (OpenCV Java)

java - 如何为手机中安装的 Whatsapp、Facebook 或其他应用程序创建共享按钮

c - Makefile 编译多个文件

c - 如何将新的源文件添加到 glibc makefile 中?

java - android java.lang.UnsatisfiedLinkError

android - 如何避免通过 FCM 发送上行消息时出现延迟

java - 如何使用 facebook sdk 4 关闭和清除 token 信息

android - 如何在 Android Emulator 中禁用 Internet 连接?