Comment utiliser .donc fichier dans le code Android pour utiliser le natif de méthodes
J'ai libmath.donc le fichier qui ont des méthodes indigènes. J'ai besoin d'appeler le natif de méthodes dans mon code android. J'ai créé un exemple de l'application android, et à l'ajout de la libmath.donc, à l'intérieur libs/armeabi dossier, Puis a couru "clic Droit de la souris" -> Android Outils -> Ajouter le support natif. Maintenant les fichiers suivants avec le contenu ci-dessous sont créés à l'intérieur jni dossier de l'application.
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmath
LOCAL_SRC_FILES := libmath.cpp
include $(BUILD_SHARED_LIBRARY)
libmath.cpp
#include <jni.h>
Quand je lance le Projet de l'application android, il montre de la façon suivante dans la console :-
17:58:41 **** Build of configuration Default for project math ****
"F:\\Vinay\\Softwares\\android-ndk-r10d\\ndk-build.cmd" all
[armeabi] Compile++ thumb: math <= libmath.cpp
[armeabi] StaticLibrary : libstdc++.a
[armeabi] SharedLibrary : libmath.so
[armeabi] Install : libmath.so => libs/armeabi/libmath.so
17:58:53 Build Finished (took 11s.695ms)
Voici le code de la façon dont je suis le chargement de la bibliothèque:-
public class MathJni {
static {
System.loadLibrary("math");
}
public native String calc(String paramString);
}
public static final MathJni math = new MathJni();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String s= math.calc("help");
}
Une fois après l'exécution de l'application android lorsque je lance l'application via l'émulateur, j'obtiens l'erreur ci-dessous.
02-06 07:38:36.900: D/dalvikvm(831): Trying to load lib /data/app-lib/com.example.math-2/libmath.so 0xb3cd0848
02-06 07:38:36.900: D/dalvikvm(831): Added shared lib /data/app-lib/com.example.math-2/libmath.so 0xb3cd0848
02-06 07:38:36.910: D/dalvikvm(831): No JNI_OnLoad found in /data/app-lib/com.example.math-2/libmath.so 0xb3cd0848, skipping init
02-06 07:38:37.540: W/dalvikvm(831): No implementation found for native Lcom/example/math/MathJni;.calc:(Ljava/lang/String;)Ljava/lang/String;
02-06 07:38:37.540: D/AndroidRuntime(831): Shutting down VM
02-06 07:38:37.550: W/dalvikvm(831): threadid=1: thread exiting with uncaught exception (group=0xb3a20ba8)
02-06 07:38:37.570: E/AndroidRuntime(831): FATAL EXCEPTION: main
02-06 07:38:37.570: E/AndroidRuntime(831): Process: com.example.math, PID: 831
02-06 07:38:37.570: E/AndroidRuntime(831): java.lang.UnsatisfiedLinkError: Native method not found: com.example.math.MathJni.calc:(Ljava/lang/String;)Ljava/lang/String;
02-06 07:38:37.570: E/AndroidRuntime(831): at com.example.math.MathJni.calc(Native Method)
02-06 07:38:37.570: E/AndroidRuntime(831): at com.example.math.MainActivity.onCreate(MainActivity.java:16)
Ce qui peut être la cause possible de cette erreur.
Vous n'avez pas montré votre code C++.
Michael est l'extrême droite. Malgré le manque d'information, j'ai toujours suppose que vous n'avez pas de calc méthode dans MathJni classe qui acceps java.lang.Instance String en paramètre...
Je n'ai pas de code c++. lorsque j'ajoute le .donc pour projet android et a couru la "Android Outils -> Ajouter le support natif".rpc fichier a été généré et c'est ce que j'ai joint ici.
Désolé j'ai oublié d'ajouter public String natif calc(String paramString); ligne MathJni classe. Maintenant que j'ai ajouté.
OriginalL'auteur Vinay | 2015-02-06
Vous devez vous connecter pour publier un commentaire.
si vous avez écrit pas de code C++ et seulement prêts à l'emploi .si les fichiers à utiliser directement à partir de Java, vous n'avez pas à utiliser le NDK.
Il suffit de déposer le .si le fichier à l'intérieur de votre projet, en vertu de
libs/<abi>
pour un projet eclipse - sousjniLibs/<abi>
pour un projet gradle.Ici ce que vous avez fait était de créer un libmath NDK module avec un presque vide de contenu. Lorsque vous avez créé votre projet, le NDK a généré une nouvelle libmath.si le fichier n'ayant rien à partir de votre bibliothèque initiale. Afin de supprimer tous vos jni des fichiers et des dossiers, copier votre ancien .si les fichiers de retour à
libs/<abi>
, et exécuter votre projet à nouveau.Si vous rencontrez des problèmes, vérifiez que votre libmath.donc implémente
jstring com_example_math_MathJni_calc(JNIEnv* env, jobject* obj)
, ou vérifier ce que vous devez déclarer natif Java côté pour utiliser votre lib, avec le bon nom de package et signature (s'il y a une documentation qui sont venus avec votre .donc les fichiers, il faudrait dire que l').Quand j'ai essayer comme mentionné, c'est de donner l'erreur ci-dessous dans le logcat tout lanching l'application. 02-06 10:34:02.840: E/AndroidRuntime(1259): java.lang.UnsatisfiedLinkError: impossible de charger les mathématiques à partir du chargeur de dalvik.système.PathClassLoader[DexPathList[[fichier zip "/data/app/com.math-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.math-1, /system/lib]]]: findLibrary retourné null
Êtes-vous toujours en utilisant le Système.loadLibrary() ? votre erreur qui me fait croire vous avez changé de Système.load() à la place. vous devriez obtenir de plus amples informations de débogage à partir de votre logcat que
findLibrary returned null
. Vérifiez également que votre .si les fichiers sont correctement intégrés dans votre apk par l'ouvrir comme un fichier zip, et de vérifier il y a à l'intérieur delib/<abi>
.Merci beaucoup pour vos commentaires.
OriginalL'auteur ph0b