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/