使用预建的共享库时,android ndk UnsatisfiedLinkError

时间:2011-03-14 14:16:41

标签: android shared-libraries android-ndk

我正在尝试创建一个链接到另一个共享库的共享库。

这是我的主要模块Android.mk:

TOP_LOCAL_PATH := $(call my-dir)
include $(call all-subdir-makefiles)

LOCAL_PATH := $(TOP_LOCAL_PATH)

include $(CLEAR_VARS)

LOCAL_CPP_EXTENSION := cpp


LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/ $(LOCAL_PATH)/lib/include
LOCAL_MODULE    := SightCore-jni
LOCAL_SRC_FILES := SightDemo.cpp SightCore-jni.cpp
LOCAL_SHARED_LIBRARIES := SightAPI
LOCAL_LDLIBS = -llog 

include $(BUILD_SHARED_LIBRARY)

我还在./lib目录中拥有预建的共享库及其自己的Android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := SightAPI
LOCAL_SRC_FILES := libSightAPI.so
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_SHARED_LIBRARY)

SightCore-jni.cpp源文件是共享库的jni接口,使用命令加载

System.loadLibrary("SightCore-jni");  

在ndk-build过程中,我得到没有编译或链接错误。 当我尝试运行应用程序并访问其中一个本机方法时,我得到了UnsatsfiedLinkError。 我注意到如果在我的jni代码中禁用对SightAPI的引用并将拼写错误输入到LOCAL_STATIC_LIBRARIES:= SightAPI行,则构建成功并且没有 UnsatisfiedLinkError
这意味着我拥有的jni代码很好(我确实它确定没问题......)

所以观察结果如下:
如果我使用预建的共享库编译共享库,我会收到损坏的 .so文件。

如果我编译相同的ndk项目而没有链接到预构建的共享库,则没问题从java端加载共享库。

如果可以,请帮帮我。

提前致谢,

伊达

3 个答案:

答案 0 :(得分:13)

发现了这个问题。

显然,ndk构建系统不会自动加载引用的共享库,即使它们是在Android.mk中声明的。

我必须致电System.loadLibrary(SightAPI) & System.loadLibrary("SightCore-jni")才能解决此问题。我原本预计加载的唯一库将是主库 SightCore-jni

嗯......我想道德就是如果你想要完成某件事,那就去做吧。)

+1罗伊塞缪尔的努力和正确的本能。

我希望这对任何人都有帮助。

干杯

答案 1 :(得分:4)

  1. 您是否确定要通过JNI使用的cpp函数名对应于System.loadLibrary("SightCore-jni");所在的Java包装类的包名?

    e.g。如果您想在java层中使用C函数myFunction,并假设您的JNI包装类在包com.my.package.sightcore中, 那么你的C代码函数名应该是这样的:

    JNIEXPORT  JNICALL Java_com_my_package_sightcore_myFunction(JNIEnv * env, jobject thiz, ...)
    
  2. 如果您在自己的设备上运行应用, 查看API级别,以及sdk版本是否与您设备的Android版本(API级别)匹配。

  3. 希望这会有所帮助。如果您需要更多说明,请告诉我......

答案 2 :(得分:0)

这发生在我身上,对我来说,解决方案是确保在切换编译器后,我包括的是正确的文件<?php $conn = mysqli_connect("localhost", "UserName", "Password", "Database"); for($m=01;$m < 13; $m++) { $sql = "SELECT user_group FROM users WHERE creation_date LIKE '%" . $m . "%'"; $result = $conn->query($sql); $users = []; if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $users[] = $row["user_group"]; }; }; $matchUserAmnt = count($users); $sql = "SELECT * FROM users"; $result = $conn->query($sql); $user_amnt = $result->num_rows; //My number is the amount of users. $percent = round($matchUserAmnt / ($user_amnt / 100),2); echo "The percent of users who joined in the month " . $m . "is " . $percent; }; 而不是libgnustl_shared.so。因此,只需确保这些文件中的任何一个是您构建的正确文件,并确保已使用最新的文件对其进行更新,就不会再遇到此问题。