我正在寻找线索为什么我的Android应用程序偶尔会在特定的ndk调用上抛出一个UnsatisfiedlinkError异常:
我有一个Android应用程序,通过ndk加载一个本机库。
本机库是用C ++编写的,并使用STL(在我的makefile中我设置了APP_STL:= stlport_static)。没有使用或需要其他库。本机库有大约300个本机方法,可用于大约20个java类。
大多数时候一切正常。但是我的用户偶尔会遇到UnsatisfiedLinkError异常。异常总是在具有相同本机函数调用的同一位置触发,但奇怪的是它甚至不是对本机函数的第一次调用,甚至不是对该特定本机函数的第一次调用。
任何线索都是受欢迎的,为什么一个特定的本机调用可能会失败。 ndk很容易被破坏?你如何调试这样的问题?
具有相同调用的简单测试程序工作正常。不过这里是源代码的一些部分:
这是Java中的问题ndk函数:
public class Server {
...
static private native long longObserveError( );
...
}
这是头文件: extern“C”{ ...
JNIEXPORT jlong JNICALL Java_be_gentgo_tetsuki_Server_longObserveError
(JNIEnv *, jclass);
...
}
这是实施:
IGSProtocol *server = 0; // initialized later...
JNIEXPORT jlong JNICALL Java_be_gentgo_tetsuki_Server_longObserveError
(JNIEnv *env, jclass)
{
Messenger &mess = server->ObserveError( );
return (long)(&mess);
}
答案 0 :(得分:2)
您的图书馆文件的名称是什么?我遇到了另一个SO帖子(https://stackoverflow.com/a/18024816),其中这个人的图书馆名称与只在某些设备上出现的系统库相冲突。重命名他的图书馆解决了这个问题。