Salut, quelqu'un peut-il me suggérer de bonnes ressources pour apprendre JNI pour Android et quelques bons tutoriels JNI?
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
}