NDK06_JNI理解、简单调用和基本数据类型

本文详细介绍NDK和JNI在Android开发中的应用,包括JNI理解、调用流程、数据类型转换及实例演示,适合初学者入门及进阶。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NDK开发汇总

一 JNI理解

JNI: java native interface
使用环境:

  • java api 不能满足我们程序的需要的时候。
  • 算法计算,图像渲染 效率要求非常高,
  • 当需要访问一些已有的本地库

NDK
工具的集合。帮助开放者快速开放C/C++ 动态库的工具。

jni 是java 语法的概念 ,ndk是android 的概念

在这里插入图片描述

二 JNI简单调用

1 编写native 方法

Eclipse或AS中新建项目,定义一个java类

public class JniMain {

	public native static String getStringFromC();

}

2 编译生成.h头文件

命令行进入到项目的根目录下
命令:

javah -classpath . -jni 包名.JniMain

生产的头文件

3. 复制.h 头文件到cpp 工程

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniMain */

#ifndef _Included_JniMain
#define _Included_JniMain
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniMain
 * Method:    getStringFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_JniMain_getStringFromC
  (JNIEnv *, jclass);

/*
 * Class:     JniMain
 * Method:    getStringFromC2
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_JniMain_getStringFromC2
  (JNIEnv *, jobject);

/*
 * Class:     JniMain
 * Method:    accessField
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_JniMain_accessField
  (JNIEnv *, jobject);

/*
 * Class:     JniMain
 * Method:    accessStaticFiel
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_JniMain_accessStaticFiel
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4. 复制jni.h 和jni_md.h(在jdk目录搜索)

改尖括号为双引号

错误:无法打开源文件jni.h
解决方法:引入jni.h的全路径
#include “C:\Users\PF0ZYBAJ\source\repos\Lsn6\Lsn6\jni.h”

5. 实现.h 头文件中的声明函数

#include "stdafx.h"
#include <stdio.h>
#include "JniMain.h"
#include <string.h>
// 静态方法 jclass
JNIEXPORT jstring JNICALL Java_com_bpj_ndk_JniMain_getStringFromC
(JNIEnv * env, jclass jclz) {
	return (*env)->NewStringUTF(env, "C string");
}

// 非静态方法 jobject
JNIEXPORT jstring JNICALL Java_com_bpj_ndk_JniMain_getStringFromC2
(JNIEnv * env, jobject jobj) {
	return (*env)->NewStringUTF(env, "C string2");
}

注意: 先要将所有的.h文件拷贝到C或CPP的.h文件夹路径,然后再资源管理器中添加现有项,而不是直接复制

6. 生成一个dll 动态库文件

工具栏Debug->x86->配置管理器-平台:x64
右键项目名->属性->常规->项目默认值-> 配置类型->动态库(.dll)
注意: 64位的平台对应64的环境,不然加载后运行失败

7. 在java中加载动态库

拷贝dll文件到项目根目录下
注意:

  • 拷贝到根目录
  • 没有.dll 后缀名

8. 触发native函数

在这里插入图片描述

静态库和动态库
都是函数库。
静态库:.a
动态库: .dll/.so

JNIEnv 是什么?
C:
JNIEnv 结构体指针的别名
env 是二级指针

C++:
JNIEnv 是机构体的别名
env 是一级指针

每个native 函数,都至少有两个参数(JNIEnv * , jclass/jobject)
jclass: native 静态方法
jobject: native 非静态方法

三 JNI基本数据类型

  1. 基本类型
    boolean jboolean
    byte jbyte;
    char jchar;
    short jshort;
    int jint;
    long jlong;
    float jfloat;
    double jdouble;

  2. 引用类型:
    String jstring
    Object jobject

  3. 基本数据类型数组:
    //type[] jTypeArray;
    byte[] jByteArray;

  4. 引用类型数组
    Object jobjectArray;

四 Demo
lsn6_JNI的简单调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值