使用本机lib时出现UnsatisfiedLinkError

时间:2011-05-24 01:08:14

标签: android android-ndk

我使用NDK将this library编译成.so。我可以使用System.LoadLibary()成功加载它,但是当我尝试库的示例代码时,它会抛出UnsatisfiedLinkError。我检查了库的源代码,它确实具有我使用的相同参数(JNIEnv和jobject除外)的函数以及相同的返回值。此外,图书馆的创建者肯定会分享工作示例代码。那么我做错了什么?我从页面复制了确切的代码,并相应地更改了变量名称。

3 个答案:

答案 0 :(得分:0)

你是如何建造这个的?我发现每次运行ndk-build之后我都必须在Eclipse中执行Project-> Clean ...让Eclipse获取.so文件并将其复制到apk。

答案 1 :(得分:0)

没有更多细节,很难说。看过该网站上的图书馆后,您可能会以不同的方式命名您的课程。您需要调用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中,其名称类似于Java_org_jiggawatt_giffle_Giffle_Init。它们具有JNI调用约定的正确本机端参数。

答案 2 :(得分:0)