2011-04-14 75 views
44

嗨,任何人都可以建议我一些很好的资源来学习JNI为Android和一些好的JNI教程?Jni教程为Android

+12

在我看来,这是由14K的意见,看到一个完全有效的问题。在这种情况下,意见是人们想要阅读的。工程师们对他们的流程方法持有自己的见解。至于吸引垃圾邮件,stackoverflow显然可以处理这个小问题。下面的答案是有用的,更有用的答案是这个网站是关于什么。 – 2014-03-13 12:39:01

+1

谷歌有一个codelab。 https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F ..%2Findex#0 – 2016-09-09 13:20:33

回答

16

我建议下载ndk。解压缩并浏览示例文件夹ndk代码。从hello-jni开始,继续前进。它很容易解释。 您还可以在浏览代码并继续来回时浏览theselinksthis

+0

你可以从我的github页面找到使用Android Studio的JNI项目:https://github.com/russell-shizhen/JniExample。我试图尽可能提供有关JNI API使用情况的示例。 – Russell 2017-12-15 06:09:29

41

教程ECLIPSE

这里是firstsecond小教程,但如果你想编写使用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 

所以你必须在你的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工作室

第1步打开简单的Android应用程序:由Android Studio中打开您的应用程序

第2步:下载NDK并在您的应用程序的本地属性(android sdk路径的下方/上方)中设置NDK的路径ndk.dir=C\:\\Android\\android-ndk-r10e

P.S.窗户双//,对于Linux一个/

第三步:添加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 \主\ 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 

窗户在cmd你必须给文件的完整路径此命令。 对于

第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 
}