JNI dossier dans Android Studio
Je suis en train de faire helloy-jni application dans Android Studio et j'ai exception
06-27 13:17:19.099 12714-12714/com.example.testjni2 E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Instrumentation.newActivity(Instrumentation.java:1071)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
at android.app.ActivityThread.access$700(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5306)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load hello-jni from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.example.testjni2-1.apk,libraryPath=/data/app-lib/com.example.testjni2-1]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:365)
at java.lang.System.loadLibrary(System.java:535)
at com.example.testjni2.MainActivity.<clinit>(MainActivity.java:9)
... 15 more
Mon projet de structure ressemble à ceci
J'ai ajouté mon build.gradle ligne:
compile files('libs/armeabi/libhello-jni.so')
Mais cela n'a pas aidé.
J'ai lu Gradle et Android plugin Gradle, mais je ne trouve pas d'informations sur le travail avec jni dossier
Je pense qu'il fichier de dépendances, mais il ne fonctionne pas
Mon bonjour-jni.c fichier includ
jstring Java_com_example_testjni2_MainActivity_stringFromJNI (JNIEnv *env, jobject thiz){
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
Mon MainActivity fichier include
public class MainActivity extends Activity {
static {
System.loadLibrary("hello-jni");
}
public native String stringFromJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String text = stringFromJNI();
Log.i("MainActivity", text);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Mon Android.mk fichier contient
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Dites-moi, s'il vous plaît, où j'ai pu faire une erreur.
Android Studio 0.1.7
OS - Windows 7 x64
- n'a été construite à l'aide de NDK outils
- J'ai créé .donc, bibliothèque utilisée Terminal Cygwin et NDK commande /cygdrive/c/Utilisateurs/%NOM_UTILISATEUR%/android-ndk/android-ndk-r8e/ndk-build est-ce pas assez?
- ses assez pour l'ajout de lib
- Comment avez-vous le résoudre?
Vous devez vous connecter pour publier un commentaire.
Le système de build gradle ne prend pas en charge le regroupement des bibliothèques natives pour le moment. Vérifier https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J pour certaines tâches personnalisées, vous devez ajouter à votre construction.gradle.
Noter que c'est une solution temporaire jusqu'à ce que gradle prend en charge la création natif de projets.
Aujourd'hui, il existe une méthode plus facile que l'on a accepté la réponse.
Tout ce que vous avez à faire est de créer un dossier appelé "jniLibs" sous votre /src/main répertoire (c'est à dire, /app/src/main/jniLibs) et le lieu de votre .donc fichiers. Il ressemblera à ceci:
Votre .les fichiers doivent être ramassés maintenant.
app/src/main/jniLibs
Il n'y a d'autre moyen à l'importation afin de le projet android.
|projet
|lib--
|----armeabi
|------libhello-jni.donc
compiler fileTree(dir:'libs', sont les suivantes: ğ lib.jar')
Vous pouvez ajouter des pré construit *.des fichiers d'Android Studio à l'aide de gradle 0.7.2+. D'abord créer le jniLibs à cet emplacement /app/src/main/emplacement et copie le tout le dossier avec un *.les fichiers (armeabi, armeabi-v7a, mips, x86) dans le jniLibs.
Comme Xavier le dit même ici https://groups.google.com/forum/#!msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ
ajouter à votre construction.gradle:
dessous:
jniLibs
?Il y a une nouvelle façon de travailler *.donc les fichiers sur gradle 0.7.3
Veuillez consulter ce lien Comment changer le répertoire libs dans Gradle?
Pour ceux qui ne veulent pas créer manuellement le
jniLibs
répertoire, voici la doc officielle de l'endroit où mettre natif libs .La doc officielle est Android Plugin DSL de Référence. Voir la version de votre gradle android version plug-in qui peut être trouvé dans Android Studio.
sourceSets
stocke les informations de ressources pour la compilation de l'application.jniLibs
desourceSets
est pour JNI libs.