web-dev-qa-db-fra.com

Tutoriel Jni pour android

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

48
Vishwanath.M

Je suggère de télécharger le ndk. Décompressez-le et parcourez l'exemple de dossier ndk codes. Commencez avec le bonjour-jni et allez plus loin. Cela explique beaucoup de choses avec facilité. Vous pouvez également parcourir cesliens et ceci tout en parcourant le code et continuer à aller et venir.

17
Raulp

Tutoriel pour Eclipse

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

Créer Android, Une fois votre projet créé, vous devrez créer un nouveau dossier à l'intérieur du niveau supérieur du projet. Pour ce faire, cliquez avec le bouton droit sur le nom de votre projet → Nouveau → Dossier. Nommez ce dossier jni. Ajoutez ensuite la classe avec le nom SquaredWrapper. Ajoutez ce code dedans

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");
    }
} 

Terminal ouvert. Vous devez compiler ce code pour obtenir le fichier d'en-tête. Appelez d'abord cette commande.

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

Que

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

Vous aurez donc un fichier d'en-tête nommé org.edwards_research.demo.jni.SquaredWrapper dans votre répertoire tmp.

ça doit être 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

changer ces nom pour un court pour votre confort, par exemple square.h. Copiez ce fichier d'en-tête dans le dossier jni de votre application. Ensuite, 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);
    }

Ajoutez ceci dans votre MainActivity.Java

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

Ajouter Android.mk fichier dans le dossier jni 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 une bibliothèque à partir des fichiers d'en-tête et cpp.

Vous n'avez donc qu'à faire quelques configurations en regardant mon premier lien Maintenant vous pouvez le compiler, assurez-vous que votre bibliothèque a créé et que votre répertoire lib le constitue.

Tutoriel pour Android Studio

Considérons que vous avez une simple application Android ouverte par Android Studio

étape 1: ouvrez votre application par Android Studio

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

P.S. pour windows double //, pour linux one /

étape 3: Ajouter le dossier JNI dans l'application (clic droit sur l'application -> nouveau -> dossier -> Dossier JNI)

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

Ajoutez ce code dans app/build.gradle pour démarrer 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éez les fichiers Android.mk et Application.mk dans le dossier JNI de l'application avec ces 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 car nous le désactivons depuis build.config. Pour créer com_example_nativedemo_app_MainActivit.h fichier dans le dossier src\main\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:

Ajoutez le 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
}
45
Hayk Nahapetyan