J'ai un problème particulier avec Android et une bibliothèque JNI que j'utilise. La bibliothèque JNI s'appelle libBase.so et est correctement incluse dans l'APK. Je suis capable de faire System.loadLibrary ("Base") et la bibliothèque est chargée et peut être utilisée sans aucun problème.Android et UnsatisfiedLinkError
Tenir compte des extraits de code suivant:
/* NativeObject.java */
public class NativeObject
{
/* ... */
static
{
System.loadLibrary("Base");
}
}
/* ObjectUtil.java */
public class ObjectUtil
{
public static native NativeObject readNative(String path);
public static native void writeNative(String path, NativeObject obj);
}
Lorsque je tente de faire ObjectUtil.readNative() au début de mon programme, je reçois les questions suivantes: logcat
05-19 18:57:38.508: WARN/dalvikvm(365): No implementation found for native Lcom/navimatics/base/ObjectUtil;.readNative (Ljava/lang/String;)Lcom/navimatics/base/NativeObject;
05-19 18:59:15.409: ERROR/AndroidRuntime(365): java.lang.UnsatisfiedLinkError: readNative
Mon la compréhension est que parce que la classe ObjectUtil référence NativeObject, le chargement de la classe ObjectUtil devrait forcer le chargement de la classe NativeObject et donc l'exécution de l'initialiseur statique NativeObject qui effectue l'appel System.LoadLibrary(). Il n'est pas clair alors pourquoi j'obtiendrais les messages de logcat susmentionnés.
Cependant, si je modifie ObjectUtil.java comme suit, il ne fait pas exception et le programme fonctionne:
/* ObjectUtil.java */
public class ObjectUtil
{
public static native NativeObject readNative(String path);
public static native void writeNative(String path, NativeObject obj);
static
{
System.loadLibrary("Base");
}
}
Il fonctionne aussi si je fais ceci:
/* ObjectUtil.java */
public class ObjectUtil extends NativeObject
{
public static native NativeObject readNative(String path);
public static native void writeNative(String path, NativeObject obj);
}
Toute aide sur ce serait grandement apprécié.
MISE À JOUR: Le code natif côté que je demandé est la suivante:
static jobject JNICALL readNative(JNIEnv *env, jclass jcls, jstring jpath)
{
// ...
}
static void JNICALL writeNative(JNIEnv *env, jclass jcls, jstring jpath, jobject jobj)
{
// ...
}
static JNINativeMethod methods[] =
{
{ "readNative", "(Ljava/lang/String;)Lcom/navimatics/base/NativeObject;", readNative },
{ "writeNative", "(Ljava/lang/String;Lcom/navimatics/base/NativeObject;)V", writeNative },
};
Les méthodes sont enregistrés à l'aide JNIEnv.RegisterNatives().
Vous n'avez pas fourni le code des déclarations côté origine, et la réponse se trouve là – ognian
Code ajouté comme demandé. –