android的JNI学习笔记

本文详细介绍了如何通过JNI实现Java与C/C++的交互,包括创建并编译Java类、生成头文件、编写C/C++实现代码及配置NDK等内容。

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

1、百度,找到最简单的学习资料,要类似hello world这样的,否则事倍功半,切记!!!

2、还真找到了hello, ^_^

3、

新建一个类,声明native方法。这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。

不在Activity类里面写是为了避免编译时报错:找不到android.support.v7.app.AppCompatActivity

public class myJNI {

  //加载so库
    static {
        System.loadLibrary("JniTest");
    }

  //native方法
    public static native String sayHello();

}

4、上一步基本不会有错,且看这一步:打开android studio终端,使用javac编译上述文件,生成class文件。

命令:

D:\AndroidStudioProject\testJNI\app\src\main\java\com\example\binbin\testjni>javac myJNI.java

注:这一步就有两问题,首先,要用CD命令(跟DOS命令一个意思)进入到前面所建的类的那个目录。

其次 很容易出现  错误: 编码GBK的不可映射字符,这时就要对javac 命令加参数,变成如下:

javac -encoding UTF-8 myJNI.java

OK,这下不报错了,通过,你会发现那目录下多了一个myJNI.class的文件

5、确认自己类的包名!然后在上一级的位置使用javah生成.h头文件

一定要在上一级哦,不然不会报错:找不到xxx类

这里一定要注意,要用CD..  命令往回走到包的起始目录,比如我这里就要回到D:\AndroidStudioProject\testJNI\app\src\main\java  目录下,然后执行javah 命令,包名是放在参数中了

D:\AndroidStudioProject\testJNI\app\src\main\java>javah -jni com.example.binbin.testjni.myJNI

OK,现在在java目录下生成了一个   .h 文件,文件名有点长。

第4步是javac, 第5步是javah

6、在java目录下新建目录:jni, 在这新目录下新建main.c文件,同时把上一步生成的.h文件中的内容复制到此文件中

注:这里新建的时候,不要建成c/c++ class, 而是要选c/c++ source file ,开始没留意,死也建不成功。

原.h文件内容:

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

#ifndef _Included_com_example_binbin_testjni_myJNI
#define _Included_com_example_binbin_testjni_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_binbin_testjni_myJNI
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello
        (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

复制,并修改后的main.c中的代码,就增加了一行 return :

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

#ifndef _Included_com_example_binbin_testjni_myJNI
#define _Included_com_example_binbin_testjni_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_binbin_testjni_myJNI
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */

//就实现了个函数 JNIEnv的用法可以自行百度,这里就不展开了
JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello
        (JNIEnv *env, jclass jobj){

  //返回一句话
    return (*env)->NewStringUTF(env,"JNI hahahahahahahaha");

}

#ifdef __cplusplus
}
#endif
#endif

7、据说还要jni目录下增加一个util.c的文件,否则会报错,暂不管,等看到报错再说,否则都不知有什么错,不利于学习^_^

8、配置NDK

打开Project的local.properties文件添加NDK路径

到了这里才发现没有NDK,不要紧,按下面的链接,两三分钟就下好了,现在对谷歌的下载界面已经没有屏蔽了,要是几年前,光下这个,估计就不知要到什么时候去了,当然那里网速也慢。^_^

https://dl.google.com/android/repository/android-ndk-r19c-windows-x86_64.zip

 

打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk {
            moduleName "JniTest"
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }

这里有个坑的地方是,build.gradle文件不要找错一个了,否则没地方加这一小段,

另外 abiFilters "armeabi", "armeabi-v7a", "x86" 这个好象是指要匹配的CPU类型??

还要在gradle.properties里面加上这么一句话:android.useDeprecatedNdk=true

配置完成

9、生成SO库

完成以上步骤之后,我们rebuild一下就可以生成so库了

在项目的app\build\intermediates\ndk\debug\lib路径下

这一步,死活成功不了,在这intermediates目录下,找不着ndk目录,我倒。。。。然后jniLibs下也没有东西

再百度,发现还需要在build.gradle中增加

sourceSets{
    main{
        jniLibs.srcDir 'src/main/java/jni'//告知jni源码目录
    }
}

追加在NDK配置时,那一段NDK的后面即可

但是这到,仍然没有生成SO文件

已经好晚了,先到这儿,改天继续研究,暂时判断的错误是前文关于NDK的配置是有问题的,android.useDeprecatedNdk要取消了:

Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio

标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值