2011-04-14 8 views
44

Salut, quelqu'un peut-il me suggérer de bonnes ressources pour apprendre JNI pour Android et quelques bons tutoriels JNI?Tutoriel Jni pour android

+12

Il me semble que c'est une question tout à fait valable comme on le voit par les vues 14k. Dans des cas comme celui-ci, les opinions sont ce que l'on veut lire. Les ingénieurs ont des opinions sur leur approche des processus. Pour ce qui est d'attirer le spam, stackoverflow peut évidemment gérer ce petit problème. Les réponses ci-dessous sont utiles et les réponses les plus utiles sont celles de ce site. –

+1

Il existe un codelab de google. https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F ..% 2Findex # 0 –

Répondre

16

Je suggère de télécharger le ndk. Décompressez-le et parcourez l'exemple de code ndk. Commencez avec le bonjour-jni et allez plus loin. Cela explique beaucoup avec facilité. Vous pouvez également parcourir theselinks et this tout en parcourant le code et continuer à revenir en arrière.

+0

Vous pouvez trouver un projet JNI pratique en utilisant Android Studio depuis ma page github: https://github.com/russell-shizhen/JniExample. J'ai essayé de fournir des exemples sur l'utilisation des API JNI autant que possible. – Russell

41

Tutoriel pour ECLIPSE

Voici first et second petits tutoriels, mais si vous voulez écrire un programme simple qui utilise JNI, vous pouvez continuer à lire :)

Créer projet d'application Android, Une fois votre projet a été créé, vous devrez créer un nouveau dossier dans le niveau supérieur du projet. Pour ce faire, faites un clic droit sur le nom de votre projet → Nouveau → Dossier. Nommez ce dossier jni. Puis ajouter une classe avec le nom SquaredWrapper. ajoutez ce code

package org.edwards_research.demo.jni; 

public class SquaredWrapper { 
    // Declare native method (and make it public to expose it directly) 
    public static native int squared(int base); 

    // Provide additional functionality, that "extends" the native method 
    public static int to4(int base) 
    { 
     int sq = squared(base); 
     return squared(sq); 
    } 

    // Load library 
    static { 
     System.loadLibrary("square"); 
    } 
} 

Ouvrez le terminal. Vous devez compiler ces codes pour obtenir le fichier d'en-tête. Au début, appelez cette commande.

cd srC# change into the source directory 
javac -d /tmp/ org/edwards_research/demo/jni/SquaredWrapper.java 

Than

cd /tmp 
javah -jni org.edwards_research.demo.jni.SquaredWrapper 

SO vous aurez le fichier d'en-tête nommé dans votre répertoire tmp.

il doit y avoir quelque chose comme ça

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class org_edwards_research_demo_jni_SquaredWrapper */ 

#ifndef _Included_org_edwards_research_demo_jni_SquaredWrapper 
#define _Included_org_edwards_research_demo_jni_SquaredWrapper 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  org_edwards_research_demo_jni_SquaredWrapper 
* Method: squared 
* Signature: (I)I 
*/ 
JNIEXPORT jint JNICALL Java_org_edwards_1research_demo_jni_SquaredWrapper_squared 
    (JNIEnv *, jclass, jint); 

#ifdef __cplusplus 
} 
#endif 
#endif 

modifier ces nom pour une courte pour votre confort, par exemple square.h. Copiez ce fichier d'en-tête dans le dossier jni de votre application. Puis, créez le fichier square.c dans le même dossier, copiez-le dedans.

#include "square.h" 

JNIEXPORT jint JNICALL Java_com_example_android_1jni_1second_1demo_SquaredWrapper_squared 
     (JNIEnv * je, jclass jc, jint base) 
    { 
      return (base*base); 
    } 

Ajouter dans votre MainActivity.java

int x = SquaredWrapper.to4(2); 
     x = x*2; 

Ajouter un fichier Android.mk dans jni dossier avec ce corps

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := squared 
LOCAL_SRC_FILES := square.c 

include $(BUILD_SHARED_LIBRARY) 

Il doit créer la bibliothèque d'en-tête et les fichiers cpp.

donc vous suffit de faire quelques configurations en regardant sur mon first lien Maintenant vous pouvez compilez, assurez-vous que votre bibliothèque a créé et votre répertoire lib se composent ce.

Tutoriel pour Android studio

Laissez vous envisager avez application simple android ouverte par Android Studio est

étape 1: ouvrir votre application par Android Studio de

étape 2: Télécharger NDK et définir le chemin vers NDK dans les propriétés locales de votre application (ci-dessous/ci-dessus de android sdk path) comme ceci ndk.dir=C\:\\Android\\android-ndk-r10e

P.S. pour des fenêtres à double //, pour linux un/

Etape 3: Ajouter un dossier JNI dans l'application (clic droit sur l'application -> nouveau -> Dossier -> Dossier JNI)

étape 4 Set le Gradle de cette façon:

Ajouter ce code dans app/build.gradle pour le démarrage NDK

sourceSets.main { 
     jni.srcDirs = [] 
     jniLibs.srcDir 'src/main/libs' 
    } 

    tasks.withType(NdkCompile) { // disable automatic ndk-build call 
    compileTask -> compileTask.enabled = false 
    } 

    task ndkBuild(type: Exec) { // call ndk-build(.cmd) script 
     if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
      commandLine 'cmd', '/c', 'ndk-build.cmd', '-C', file('src/main').absolutePath 
     } else { 
      commandLine 'ndk-build', '-C', file('src/main').absolutePath 
     } 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 

étape 4:

Créer des fichiers Android.mk et Application.mk dans le dossier JNI de l'application avec ce corps:

Android.mk

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := main 
LOCAL_SRC_FILES := main.cpp 

include $(BUILD_SHARED_LIBRARY) 

Application.mk

APP_ABI := all 
include $(BUILD_SHARED_LIBRARY) 

Dans APP_ABI, vous choisissez les compilateurs à utiliser. Il

étape 5:

Nous devons exécuter manuellement NDK comme nous le désactiver à partir build.config. Pour la création du fichier com_example_nativedemo_app_MainActivit.h dans src \ principal dossier \ jn nous devons exécuter cette commande dans le terminal

javah -d .\jni -classpath C:\Intel\INDE\IDEintegration\android-sdk-windows\platforms\android-21\android.jar;..\..\build\intermediates\classes\debug com.example.mydemo.nativedemo.MainActivity 

pour Windows cmd vous devez donner le chemin complet des fichiers. Pour

étape 6:

Ajouter un fichier main.cpp dans le dossier JNI avec ce corps:

#include <string.h> 
#include <jni.h> 
#include <vchat_cpptest_Hellojnicpp.h> 

extern "C" { 
     JNIEXPORT jstring JNICALL 
     Java_vchat_cpptest_Hellojnicpp_stringFromJNI 
     (JNIEnv *env, jobject obj) 
     { 
      #ifdef __INTEL_COMPILER_UPDATE 
       return env->NewStringUTF("Hello from Intel C++ over JNI!"); 
      #else 
       return env->NewStringUTF("Hello from default C++ over JNI!"); 
      #endif 
}