2011-03-14 3 views
12

J'essaie de créer une bibliothèque partagée qui lie à une autre bibliothèque partagée.android ndk UnsatisfiedLinkError lors de l'utilisation d'une bibliothèque partagée prédéfinie

Voici mon module principal 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) 

j'ai aussi la bibliothèque partagée préconstruits dans le répertoire ./lib avec son propre fichier 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) 

Le SightCore- fichier source jni.cpp est l'interface jni à la bibliothèque partagée et est chargé en utilisant la commande

System.loadLibrary("SightCore-jni"); 

Pendant la processus ndk-build je reçois pas de compilation ou de liaison erreurs. Lorsque j'essaie d'exécuter l'application et d'accéder à l'une des méthodes natives, j'obtiens UnsatsfiedLinkError. J'ai remarqué que si désactiver les références à SightAPI dans mon code jni et mettre une faute de frappe à la ligne LOCAL_STATIC_LIBRARIES: = SightAPI, La construction est réussie et il n'y a pas UnsatisfiedLinkError.
Cela signifie que le code JNI J'est bon (je suis en fait que c'est ok ...)

Ainsi, l'observation est la suivante:
Si je compile la bibliothèque partagée avec le préconstruit bibliothèque partagée J'ai un corrompu fichier .so.

Si je compilez le même projet NDK sans lien vers le préconstruit bibliothèque partagée il n'y a pas de problème chargement de la bibliothèque partagée du côté java.

S'il vous plaît aidez-moi si vous le pouvez.

Merci à l'avance,

Ita

+0

Quel message d'erreur voyez-vous dans logcat? Devrait être un message au-dessus de l'exception UnsatisfiedLinkError, probablement avec la sortie de dlopen(). Aussi, quelle version d'Android utilisez-vous? – fadden

+0

Comment puis-je lier ma bibliothèque partagée au projet Android NDK Pouvez-vous s'il vous plaît Expliquez-moi – user1089679

Répondre

13

a trouvé le problème.

Apparemment, le système de compilation ndk ne charge pas automatiquement les bibliothèques partagées référencées, même si elles sont déclarées dans votre Android.mk. J'ai dû faire appel au System.loadLibrary(SightAPI) & System.loadLibrary("SightCore-jni") afin de résoudre ce problème. Je me serais attendu à ce que la seule bibliothèque à charger aurait été la bibliothèque principale SightCore-jni.

Well..I deviner la morale est que si vous voulez quelque chose, faites-le vous-même :)

+1 à Roy Samuel pour ses efforts et instincts corrects.

J'espère que cela aide tout le monde.

Salutations

+0

Je dois mettre cette System.loadLibrary (SightAPI) en statique {}.? et avec "SightAPI"? – user1089679

4
  1. Avez-vous vérifié que le nom de la fonction cpp, que vous souhaitez utiliser plus JNI, est correspondant au nom du package de l'emballage Java classe où System.loadLibrary("SightCore-jni"); est présent?

    par exemple. Si vous souhaitez utiliser la fonction C, myFunction dans la couche java, et supposons que votre classe wrapper JNI est dans le paquet com.my.package.sightcore, alors votre nom de la fonction de code C devrait ressembler à ceci:

    JNIEXPORT JNICALL Java_com_my_package_sightcore_myFunction(JNIEnv * env, jobject thiz, ...) 
    
  2. Si vous exécutez votre application sur votre appareil, Vérifiez si les niveaux d'API et, par conséquent, la version de sdk correspondent à la version Android de votre appareil (niveau API).

Espérons que cela aide. Faites-moi savoir si vous avez besoin de plus de précisions ...

+0

se référer à cet excellent tutoriel, cela pourrait aider: http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by -step/ –

+0

Que se passe-t-il si nous avons un fichier .so qui n'a pas été conçu pour être utilisé dans l'environnement JNI. La méthode de cette bibliothèque n'aurait pas la convention de nommage créée par la commande javah d'appliquer le nom du paquet et le nom de la classe à la fonction. Comment cela fonctionnerait-il? Merci – Thiago

+0

Autant que je sache, si le fichier .so n'a pas la convention de nommage correcte, c'est-à-dire le schéma de nommage JNI, il ne sera pas "exporté" au niveau java. Par conséquent, ne peut pas être utilisé. Vous devrez obtenir la source de cette bibliothèque et la construire avec la convention de nommage correcte, afin qu'elle puisse être visible pour être utilisée sur la couche Java. J'espère que cela t'aides. –

Questions connexes