android studio JNI开发

一、JNI的作用:

1.使Java与本地其他类型语言(C、C++)交互;

2.在Java代码调用C、C++等语言的代码 或者 C、C++调用Java代码。

由于JAVA具有跨平台的特点,所以JAVA与本地代码的交互能力弱,采用JNI特性可以增强JAVA与本地代码的交互能力。

二、AndroidStudion中JNI的使用方法:

1、在AS,点击File ->Setting,下载NDK 和 CMake。

2、配置环境变量:

path中添加环境变量:C:\Users\a\AppData\Local\Android\Sdk\ndk\26.0.10404224\build(我的环境)。

配置的是NDK在系统里安装的位置。

三、测试demo:

  1. 新建一个工程JNITest,在工程的包名下,新建一个JAVA类,类名为JNITest:
java 复制代码
package com.example.myapplication;

public class JNITest {
    public native String getJNIString();
}
  1. 使用javac命令编译JNITest.java文件,生成JNITest.class文件。

在工程目录下执行如下命令:javac .\JNITest.java

执行完毕后可以看到包名下面生成了对应的class文件,如下图所示:

  1. 生成JNITest.class文件后,需要生成对应的.h文件:

在工程目录下执行如下命令:javah -d app/src/main/jni -classpath app/src/main/java/ -jni -v com.example.myapplication.JNITest

执行完毕后可以看到在app/src/main目录下生成了jni目录,目录里生成了对应的.h文件,文件名为com_example_myapplication_JNITest.h

  1. 在jni目录下,新建一个cpp文件,命名为JNITest.cpp,文件里实现JNITest.java文件里定义的本地方法:

右击jni->New->C/C++ Source File->输入JNITest

JNITest.cpp 文件代码:

cpp 复制代码
#include <jni.h>
#include "JNITest.h"

JNIEXPORT jstring JNICALL Java_com_example_myapplication_JNITest_getJNIString
  (JNIEnv* env, jobject)
{
    return env->NewStringUTF("Hello From JNITest Function(getJNIString)");
}

com_example_myapplication_JNITest.h 文件代码:

cpp 复制代码
#include <jni.h>
/* Header for class com_example_myapplication_JNITest */

#ifndef _Included_com_example_myapplication_JNITest
#define _Included_com_example_myapplication_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_myapplication_JNITest
 * Method:    getJNIString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_myapplication_JNITest_getJNIString
  (JNIEnv *, jobject){
  {
      return env->NewStringUTF("Hello From JNITest Function(getJNIString)");
  }
  };

#ifdef __cplusplus
}
#endif
#endif
  1. 在jni目录下,再新建一个Android.mk文件:

右击jni目录->New->File->输入Android.mk,在文件里写入如下配置:

复制代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := JNITest.cpp
include $(BUILD_SHARED_LIBRARY)

再新建文件夹:Application.mk,写入配置:

复制代码
APP_PLATFORM := android-21
APP_ALLOW_MISSING_DEPS=true
  1. 在终端进入到项目"app/src/main/jni"目录下,执行ndk-build,执行后在app/src/main目录下自动生成lib文件夹,生成好的so库文件就在lib文件夹下,如下图所示:
相关推荐
又见情义2 小时前
RK3568 Android 13 板载驱动适配-USB
android·arm开发·驱动开发
delta_hell3 小时前
【阅读源码-Android】动画之Choreographer-2
android·源码·choreographer
mmsx3 小时前
基于 Android 的博物馆文化展示与预约 App —— 设计与实现(有源码和文档)
android·app·源码·文档
一笑的小酒馆4 小时前
AndroidAGP9.0升级之路
android
阮胜昌4 小时前
MySQL 中的动态数据脱敏:无需更改应用程序即可保护敏感数据
android·mysql·adb
aaajj6 小时前
关于MODIFY_PHONE_STATE权限
android
古法安卓7 小时前
Android-高版本 LMKD 源码解析:基于 PSI 的内存压力监控与查杀全流程
android·java·android studio
古法安卓7 小时前
Android-PSI 详解:libpsi 源码解析——116 行代码架起 lmkd 与内核之间的桥
android·java·android studio
mmsx10 小时前
Android 新闻资讯客户端实战:从零搭建一个完整的新闻 App
android·app·源码
三84412 小时前
PHP 绕过污点追踪构造 Webshell:反序列化引用复用与 Trait 可变函数 RCE
android