使用本机lib时出现UnsatisfiedLinkError

问题描述

| 我使用NDK将这个库编译成.so。我可以使用System.LoadLibary()成功加载它,但是当我尝试该库的示例代码时,它将引发UnsatisfiedLinkError。我检查了该库的源代码,它确实具有与相同参数(jnienv和jobject除外)一起使用的函数以及相同的返回值。另外,库的创建者肯定会共享有效的示例代码。那我在做什么错?我从页面复制了确切的代码,并相应地更改了变量名。     

解决方法

没有更多细节,很难说。在查看了该站点上的库之后,可能已对类进行了不同的命名。您需要调用Java类
Giffle
,它必须位于包
org.jiggawatt.giffle
中。这不是您偶然偶然发现的命名约定;-)
package org.jiggawatt.giffle;

public class Giffle {
    static {
        System.loadLibrary(\"gifflen\");
    }

    public native int Init(String gifName,int w,int h,int numColors,int quality,int frameDelay);
    public native void Close();
    public native int AddFrame(int[] inArray);
}
要使用它,您可以在
Giffle
类中进行调用,或者可能更干净的方法是使用实​​例:
Giffle giffle = new Giffle();
giffle.Init(...);
giffle.AddFrame(...);
giffle.Close();
Java部分不在zip中似乎有些奇怪,尤其是在类名被硬编码到C符号中的情况下。也许编写它的人在Java部分中有一堆额外的代码,他不想让任何人看到。 据我所知,C和C ++代码是完整的。您根本不需要修改它。本地方法的实现在gifflen.cpp中,并且具有类似“ 5”的名称。它们具有JNI调用约定的正确本机侧参数。     ,您如何建立这个?我发现我每次运行
ndk-build
之后都必须在Eclipse中执行Project-> Clean…,以便Eclipse拾取.so文件并将其复制到apk。     ,试试这个方法。 http://mpigulski.blogspot.com/2010/09/debugging-dlopen-unsatisfiedlinkerror.html对我有帮助。