Привет, может ли кто-нибудь предложить мне хорошие ресурсы для изучения JNI для Android и некоторых хороших учебников JNI?
Jni Tutorial для Android
Ответ 1
Я бы предложил загрузить ndk. Разархивируйте его и просмотрите коды примеров ndk. Начните с приветствия и идите дальше. Это объясняет многое с легкостью. Вы также можете просмотреть эти ссылки и просматривая код и продолжая идти туда и обратно.
Ответ 2
Учебное пособие для ECLIPSE
Вот первый и второй небольшой учебник, но если вы хотите написать простую программу, которая использует 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
SO, у вас будет заголовочный файл с именем 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.
Итак, вам нужно только выполнить некоторые настройки, посмотрев мою
Теперь вы можете скомпилировать его, убедитесь, что ваша библиотека создана, и ваш каталог lib
состоит из него.
Учебное пособие для Android Studio
Предположим, у вас есть простое приложение для Android, открытое Android Studio
шаг 1: откройте приложение Android Studio
Шаг 2: Загрузите NDK и установите путь к NDK в локальных свойствах вашего приложения (ниже/выше пути android sdk), например, ndk.dir=C\:\\Android\\android-ndk-r10e
P.S. для windows double//, для linux one/
step3: Добавить папку 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
}
Ответ 3
Кстати, вы можете использовать классные обертки для классов Java. И вам не понадобятся учебники JNI. С помощью этих оболочек вы сможете написать код на С++ так же, как в java. Например, что-то вроде этого:
...
View someView;
someView.setAlpha(0.5);
...
Вот ссылка: http://code.google.com/p/android-cpp-sdk/