r17b r16 r13 ndk64 ndk 13b android jni

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?


Sugeriría descargar el ndk. Descomprímalo y ndk códigos ndk carpeta de muestra. Comience con el hello-jni y vaya más allá. Explica mucho con facilidad. También puede navegar por these links y this mientras revisa el código y sigue yendo y viniendo.


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 }