Jni Tutorial для Android


Answers

Учебное пособие для ECLIPSE

Вот first и second небольшие учебные пособия, но если вы хотите написать простую программу, которая использует JNI, вы можете продолжить чтение :)

Создайте проект приложения для Android. Как только ваш проект будет создан, вам нужно будет создать новую папку на верхнем уровне проекта. Для этого щелкните правой кнопкой мыши название вашего проекта → Новая → Папка. Назовите эту папку jni. Затем добавьте класс с именем SquaredWrapper . добавьте в него этот код

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

Открытый терминал. Вы должны скомпилировать этот код для получения файла заголовка. Сначала вызовите эту команду.

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

чем

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

org.edwards_research.demo.jni.SquaredWrapper у вас будет заголовочный файл с именем org.edwards_research.demo.jni.SquaredWrapper в вашем каталоге tmp .

это должно быть что-то вроде этого

/* 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

измените это имя на какой-нибудь короткий для вашего комфорта, например square.h. Скопируйте этот файл заголовка в папку jni вашего приложения. Затем создайте файл square.c в той же папке, скопируйте его в него.

 #include "square.h"

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

Добавьте это в свой MainActivity.java

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

Добавьте файл Android.mk в папку jni с этим телом

    LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := squared
LOCAL_SRC_FILES := square.c

include $(BUILD_SHARED_LIBRARY)

Он должен создавать библиотеку из файлов заголовков и cpp.

Поэтому вам нужно только выполнить некоторые настройки, просмотрев мою first ссылку. Теперь вы можете скомпилировать ее, убедитесь, что ваша библиотека создана, и ваш каталог lib состоит из нее.

Учебник для Android Studio

Предположим, у вас есть простое приложение для Android, открытое Android Studio

Шаг 1: откройте приложение Android Studio

Шаг 2: Загрузите NDK и установите путь к NDK в локальных свойствах вашего приложения (ниже / выше пути android sdk), как этот ndk.dir=C\:\\Android\\android-ndk-r10e

PS для windows double //, для linux one /

Шаг 3: добавьте папку JNI в приложение (щелкните правой кнопкой мыши на приложении -> новая -> папка -> Папка JNI)

Шаг 4. Установите Gradle таким образом:

Добавьте этот код в app/build.gradle для запуска 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
    }

Шаг 4:

Создайте файлы Android.mk и Application.mk в папке JNI приложения с помощью этих тел:

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)

В APP_ABI вы выбираете, какие компиляторы использовать. Это

Шаг 5:

Мы должны вручную запустить NDK, поскольку мы отключили его от build.config . Для создания файла com_example_nativedemo_app_MainActivit.h папке src \ main \ jn мы должны запустить эту команду в терминале

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

для Windows cmd вы должны предоставить полный путь к файлам. Для

Шаг 6:

Добавьте файл main.cpp в папку JNI с этим телом:

#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
}
Question

Привет, может ли кто-нибудь предложить мне хорошие ресурсы для изучения JNI для Android и некоторых хороших учебников JNI?




Links



Tags

android android   jni