我正在尝试创建一个链接到另一个共享库的共享库。
这是我的主要模块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端加载共享库。
如果可以,请帮帮我。
提前致谢,
伊达
答案 0 :(得分:13)
发现了这个问题。
显然,ndk构建系统不会自动加载引用的共享库,即使它们是在Android.mk中声明的。
我必须致电System.loadLibrary(SightAPI) & System.loadLibrary("SightCore-jni")
才能解决此问题。我原本预计加载的唯一库将是主库 SightCore-jni 。
嗯......我想道德就是如果你想要完成某件事,那就去做吧。)
+1罗伊塞缪尔的努力和正确的本能。
我希望这对任何人都有帮助。
干杯
答案 1 :(得分:4)
您是否确定要通过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, ...)
如果您在自己的设备上运行应用, 查看API级别,以及sdk版本是否与您设备的Android版本(API级别)匹配。
希望这会有所帮助。如果您需要更多说明,请告诉我......
答案 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
。因此,只需确保这些文件中的任何一个是您构建的正确文件,并确保已使用最新的文件对其进行更新,就不会再遇到此问题。