Jni教程for android
嗨,任何人都可以build议我一些很好的资源来学习JNI为Android和一些很好的JNI教程?
我会build议下载ndk。 解压缩并浏览示例文件夹ndk代码。 从hello-jni开始,走得更远。 它很容易解释。 您也可以浏览这些 链接 ,同时浏览代码并继续来回。
ECLIPSE教程
这里是第一和第二个小教程,但是如果你想写一个使用JNI的简单程序,你可以继续阅读:)
创buildAndroid应用程序项目,创build项目后,需要在项目顶层创build一个新的文件夹。 要做到这一点,请右键单击您的项目名称→新build→文件夹。 命名这个文件夹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"); } }
打开terminal。 您必须编译这些代码以获取头文件。 首先调用这个命令。
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
所以你的头文件在你的tmp
目录下名为org.edwards_research.demo.jni.SquaredWrapper
。
它一定是这样的
/* 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文件夹中。 在相同的文件夹中创buildsquare.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;
在这个机构的jni
文件夹中添加Android.mk
文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := squared LOCAL_SRC_FILES := square.c include $(BUILD_SHARED_LIBRARY)
它必须从头文件和cpp文件创build库。
所以你只需要通过查看我的第一个链接来做一些configuration现在你可以编译它,确保你的库已经创build,并且你的lib
目录包含它。
Android Studio教程
让我们考虑你有Android Studio打开的简单的Android应用程序
第1步:通过Android Studio打开您的应用程序
第2步:下载NDK并在你的应用程序的本地属性(android sdkpath下面/上面)中设置NDK的path,如下所示ndk.dir=C\:\\Android\\android-ndk-r10e
PS for windows double //,for linux one /
第三步:在应用程序中添加JNI文件夹(右键单击应用程序 – >新build – >文件夹 – > 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:
在这个机构的应用程序的JNI文件夹中创build文件Android.mk和Application.mk:
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中,您可以select使用哪些编译器。 它
步骤5:
我们必须手动运行NDK,因为我们从build.config
禁用它。 为了在src \ main \ jn文件夹中创buildcom_example_nativedemo_app_MainActivit.h
文件,我们必须在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
对于Windows CMD你必须给文件的完整path。 对于
步骤6:
在本体中添加JNI文件夹中的main.cpp文件:
#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 }
顺便说一句,你可以使用一些很酷的包装的Java类。 而且你不需要JNI教程。 有了这个包装器,你将能够像在java中一样编写一个C ++代码。 比如像这样的东西:
... View someView; someView.setAlpha(0.5); ...
这里是链接: http : //code.google.com/p/android-cpp-sdk/