相关疑难解决方法(0)

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

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

这是我的主要模块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)
Run Code Online (Sandbox Code Playgroud)

我还有./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)
Run Code Online (Sandbox Code Playgroud)

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

System.loadLibrary("SightCore-jni");  
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果可以,请帮帮我.

提前致谢, …

android shared-libraries android-ndk

12
推荐指数
1
解决办法
1万
查看次数

JNI - UnsatisfiedLinkError - loadLibrary总是失败

我试图让一个简单的JNI示例工作,但无论我做什么,我都无法使用loadLibrary命令使其工作.如果我指定.so文件的绝对路径并使用System.load而不是System.loadLibrary,它将完美地工作.

这是我的目录树:

.
|-- -
|-- TranslatorWrapper.c
|-- TranslatorWrapper.class
|-- TranslatorWrapper.cpp
|-- TranslatorWrapper.h
|-- TranslatorWrapper.java
`-- libTranslatorWrapper.so
Run Code Online (Sandbox Code Playgroud)

这是Java代码:

public class TranslatorWrapper {

    public native String translate(byte[] bytes);

    public static void main(String[] args) {
        TranslatorWrapper w = new TranslatorWrapper();
        System.out.println("From JNI: " + w.translate(null));
    }
    static {
        System.out.println("Attempting to load library from " + System.getProperty("java.library.path"));
        System.loadLibrary("TranslatorWrapper");
        //System.load("/path/to/example/libTranslatorWrapper.so");
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道.so文件需要在java.library.path文件夹中,所以我用参数启动程序

java TranslatorWrapper -Djava.library.path=.
Run Code Online (Sandbox Code Playgroud)

因为该库与.class文件位于同一目录中.但是,似乎忽略了该值:

Attempting to load library from .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
Exception in thread "main" java.lang.UnsatisfiedLinkError: no TranslatorWrapper in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1754) …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface native

4
推荐指数
1
解决办法
7990
查看次数