适用于Android的Jni教程

Vis*_*h.M 48 java-native-interface android

嗨,有人能建议我学习JNI for Android和一些优秀的JNI教程吗?

Hay*_*yan 46

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");
    }
} 
Run Code Online (Sandbox Code Playgroud)

打开终端.您必须编译这些代码才能获取头文件.首先调用此命令.

cd src # change into the source directory
javac -d /tmp/ org/edwards_research/demo/jni/SquaredWrapper.java
Run Code Online (Sandbox Code Playgroud)

cd /tmp
javah -jni org.edwards_research.demo.jni.SquaredWrapper
Run Code Online (Sandbox Code Playgroud)

因此,您将org.edwards_research.demo.jni.SquaredWrappertmp目录中找到头文件.

它一定是这样的

/* 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
Run Code Online (Sandbox Code Playgroud)

为了您的舒适,请将这些名称更改为一些简短的名称,例如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);
    }
Run Code Online (Sandbox Code Playgroud)

将此添加到您的 MainActivity.java

int x = SquaredWrapper.to4(2);
        x = x*2;
Run Code Online (Sandbox Code Playgroud)

使用此正文添加Android.mk文件jni夹中的文件

    LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := squared
LOCAL_SRC_FILES := square.c

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

它必须从header和cpp文件创建库.

因此,您只需通过查看我的第一个链接来进行一些配置现在您可以编译它,确保您的库已创建并且您的lib目录包含它.

Android Studio教程

让我们考虑一下Android Studio打开的简单Android应用程序

第1步:通过Android Studio打开您的应用程序

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

PS for 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
    }
Run Code Online (Sandbox Code Playgroud)

第4步:

使用以下主体在应用程序的JNI文件夹中创建文件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)
Run Code Online (Sandbox Code Playgroud)

Application.mk

APP_ABI := all
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

对于Windows 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
}
Run Code Online (Sandbox Code Playgroud)


Rau*_*ulp 17

我建议下载ndk.解压缩并浏览示例文件夹ndk代码.从hello-jni开始,再往前走.它解释了很多.您也可以浏览这些 链接这个同时通过代码去和保持未来来回.