嗨,有人可以建议我学习JNI for Android和一些优秀的JNI教程吗?
答案 0 :(得分:44)
ECLIPSE教程
这是first和second小教程,但是如果你想编写一个使用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
因此,您的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)
它必须从header和cpp文件创建库。
因此,您只需查看我的first链接即可进行一些配置
现在您可以编译它,确保您的库已创建,并且您的lib
目录包含它。
Android Studio教程
让我们考虑一下Android Studio打开的简单Android应用程序
第1步:通过Android Studio打开您的应用
第2步:下载NDK并在应用程序的本地属性中设置NDK的路径(在android sdk路径下方/上方),如ndk.dir=C\:\\Android\\android-ndk-r10e
P.S。对于windows double //,对于linux one /
第3步:在应用中添加JNI文件夹(右键点击应用 - &gt; new - &gt;文件夹 - &gt; 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文件夹中创建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中,您可以选择要使用的编译器。它
第5步:
我们必须手动运行NDK,因为我们会从build.config
禁用它。要在src \ main \ jn文件夹中创建com_example_nativedemo_app_MainActivit.h
文件,我们必须在终端
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步:
使用此正文在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
}
答案 1 :(得分:17)