gpt4 book ai didi

android - 安卓 Jni 教程

转载 作者:IT王子 更新时间:2023-10-28 23:45:59 33 4
gpt4 key购买 nike

您好,谁能给我推荐一些学习 JNI for Android 的好资源和一些好的 JNI 教程?

最佳答案

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 目录中会有一个名为 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 文件夹中。比在同一文件夹中创建 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;

jni 文件夹中添加 Android.mk 文件和这个正文

    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 Studio 打开的简单 android 应用程序

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

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

附:对于 windows 双//, 对于 linux one//

第三步:在应用中添加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 步:

在应用程序的 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
}

关于android - 安卓 Jni 教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659068/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com