android - r16 - ndk r13
Jni Tutorial para Android (2)
Hola, ¿alguien puede sugerirme algunos buenos recursos para aprender JNI para Android y algunos buenos tutoriales de JNI?
Tutorial para ECLIPSE
Aquí está el first y el second tutoriales pequeños, pero si desea escribir un programa simple que use JNI, puede continuar leyendo :)
Crear proyecto de aplicación de Android. Una vez que haya creado su proyecto, deberá crear una nueva carpeta dentro del nivel superior del proyecto. Para hacer esto, haga clic derecho en el nombre de su proyecto → Nuevo → Carpeta. Nombre esta carpeta jni. SquaredWrapper
agrega la clase con el nombre SquaredWrapper
. agregue estos códigos en él
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 abierto. Debe compilar estos códigos para obtener el archivo de encabezado. Primero llama a este comando.
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
ASÍ QUE tendrás un archivo de encabezado llamado org.edwards_research.demo.jni.SquaredWrapper
en tu directorio tmp
.
debe ser algo como esto
/* 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
cambie este nombre por uno corto para su comodidad, por ejemplo, square.h. Copie este archivo de encabezado en la carpeta jni de su aplicación. Luego de crear el archivo square.c en la misma carpeta, copia esto en él.
#include "square.h"
JNIEXPORT jint JNICALL Java_com_example_android_1jni_1second_1demo_SquaredWrapper_squared
(JNIEnv * je, jclass jc, jint base)
{
return (base*base);
}
Agregue esto en su MainActivity.java
int x = SquaredWrapper.to4(2);
x = x*2;
Agregue el archivo Android.mk
en la carpeta jni
con este cuerpo
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := squared
LOCAL_SRC_FILES := square.c
include $(BUILD_SHARED_LIBRARY)
Debe crear una biblioteca desde el encabezado y los archivos cpp.
Así que solo tiene que hacer algunas configuraciones buscando en mi first enlace. Ahora puede compilarlo, asegúrese de que su biblioteca lo haya creado y su directorio lib
contenga.
Tutorial para Android Studio
Consideremos que tiene una aplicación de Android simple abierta por Android Studio
paso 1: abre tu aplicación en Android Studio
paso 2: descarga NDK y establece la ruta a NDK en las propiedades locales de tu aplicación (debajo / arriba de la ruta sdk de Android) como esta ndk.dir=C/://Android//android-ndk-r10e
PS para Windows doble //, para Linux uno /
Paso 3: Agrega la carpeta JNI en la aplicación (haz clic con el botón derecho en la aplicación -> nueva -> carpeta -> Carpeta JNI)
paso 4 Configura el Gradle
de esta manera:
Agregue este código en la app/build.gradle
para iniciar 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
}
etapa 4:
Crea archivos Android.mk y Application.mk en la carpeta JNI de la aplicación con estos cuerpos:
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)
En APP_ABI eliges qué compiladores usar. Eso
paso 5:
Tenemos que ejecutar NDK manualmente ya que lo deshabilitamos desde build.config
. Para crear el archivo com_example_nativedemo_app_MainActivit.h
en la carpeta src / main / jn, debemos ejecutar este comando en la 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
para windows cmd tienes que dar la ruta completa de los archivos. por
paso 6:
Agregue el archivo main.cpp en la carpeta JNI con este cuerpo:
#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
}