JNI学习

JNI入门教程:最小环境HelloWorld实战 JNI是Android应用开发中不太常涉及的技术,但在Framework层中却被广泛使用。作为一名Android应用开发人员,学习JNI知识,对理解整个系统原理还是有很大帮助的。 学习JNI有很多途径: 可以直接阅读Framework源码。这种方案不太好上手验证,因为Framework代码要配置的编译环境还是比较复杂的,而且编译后没法直接运行测试,需要Root系统 其次也可以下载安装NDK,直接在Android Studio里开发项目。这种方式也有比较多的环境配置工作,并且操作起来比较麻烦。 因此这篇文 阅读详情

本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。

    Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。

  • 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的
  • 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的
  • 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们

    在《java核心技术》中,作者提到JNI的时候,建议不到万不得已不要使用JNI技术,一方面它需要你掌握更多的知识才可以驾驭,一方面使用了JNI你的程序就会丧失可移植性。在本文我们跳过JNI的底层机制,读者最好先把它想象为本地代码和java代码的粘合剂。关系如下图所示:
20041113144221539.gif

 

 

 

 





 

 

 

    下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。

  1. 编写java代码
    我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示
    class HelloWorld 
    {
        public native void displayHelloWorld();
        static {
            System.loadLibrary("hello");
        }
        
        public static void main(String[] args) {
            new HelloWorld().displayHelloWorld();
        }
    }
    注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so)
  2. 编译java代码
    javac HelloWorld.java  生成HelloWorld.class文件
  3. 创建.h文件
    这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行
    javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下
    在此我们不对他进行太多的解释。
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloWorld */
    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloWorld
     * Method:    displayHelloWorld
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
      (JNIEnv *, jobject);
    #ifdef __cplusplus
    }
    #endif
    #endif
  4. 编写本地实现代码
    在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下
    #include <jni.h>
    #include "HelloWorld.h"
    #include <stdio.h>

    JNIEXPORT void JNICALL 
    Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 
    {
        printf("Hello world!/n");
        return;
    }
    注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。
  5. 运行java程序
    把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world|
    的输出了。

    JNI是一门复杂,有趣且富有挑战性的技术,我们在后面的几篇文章中将说明如何在java语言和Native语言之间进行交互。

android jni学习——1小时掌握JNI(深入浅出) 文章目录学习总结参考补充知识点1. static代码段 学习总结 我参考了以下四篇博文,基本掌握了JNI的常用知识点。 推荐学习顺序1->2->3->4。 1, 2这两篇博文写的很细致,看完基本能学会80%内容,要详读。 通过第3篇博文的例子可以进一步巩固下jni的知识。 第四篇内容最全,不过内容更像是手册,可以一扫而过 参考 Android NDK开发:JNI基础篇 Andr... 阅读详情

相关推荐

域自适应的理解与想法(Domain Adaptation)

这幅图是域适应非常有名的一篇论文中的插图,被很多文章转载。 什么是领域自适应? Domain Adaptation是迁移学习中很重要的一部分内容,目的是把分布不同的源域和目标域的数据,映射到一个特征空间中,使其在该空间中的距离尽可能近。于是在特征空间中对source domain训练的目标函数,就可以迁移到target domain上,提高target domain上的准确率。 上面的图主要的思想来源于GAN,上图由三部分组成:特征映射网络 标签分类网络和和域判别网络 其中,source domain的数.

yuanxue18的博客 5983

Android JNI学习(二)——实战JNI之“hello world”

JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互

Jason_Lee155的博客 1332

微机原理--输入输出实验--emu8086

通过实验,验证了基本要求,实现了一位数加法运算的功能,同时实现了两位数加法运算的功能,还有一位数的除法。思考题(1)输入输出数据和计算用数据的区别:从键盘上输入以及输出的数据要在通过转化为计算机所识别的二进制的数字,和计算所用的数据之间相差30H。(2)单字符输入输出和串输入输出的不同之处:单字符的输入使用1号功能键,输出通过2号功能调用,且待显示字符送给DL寄存器;串输入使用0A功能,输出通过9号功能调用,DS:DX指向待显示字符串,且字符串必须以“$”结束。

m0_58837398的博客 2419

JNI入门教程之HelloWorld篇

   本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。     Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。标准的java类库没有提供你的应

mingjava的专栏 9万+

汽车软件工程师必看:ASPICE开发流程全解析(附各阶段交付物清单)

本文全面解析了汽车行业广泛采用的ASPICE开发流程,详细介绍了从需求挖掘到系统架构设计、软件工程及测试验证各阶段的关键操作和交付物清单。针对汽车软件工程师,提供了实用的协作指南和工具推荐,帮助团队提升开发效率并降低项目风险,是掌握ASPICE标准的必备指南。

weixin_30733003的博客 649

OpenBCI脑电帽硬件DIY与低成本搭建实战

本文详细介绍了如何通过第三方兼容硬件和开源设计,低成本DIY一套功能完备的OpenBCI脑电采集系统。从硬件选购、组装、软件配置到信号调试,提供了完整的实战指南,将总成本控制在千元级别,使脑机接口技术对爱好者、学生和研究者变得更加触手可及。

weixin_29322855的博客 796

JNI之HelloWorld

JNI是java native interface的缩写,JNI是一个标准编程接口,用于编写java本地方法并嵌入虚拟机至本地应用程序的。它的主要目的是为了在给定平台上通过所有java虚拟机的本地二进制方法实现的兼容性。 环境与工具 clion idea jdk8 MinGW 编写一个自己的native方法接口与实现 编写native方法 /** * @author 会灰翔的灰机 * @d...

阿呆的专栏 896

FPGA工程师必看:JESD204B同步机制实战指南(含SYSREF信号调试技巧)

本文为FPGA工程师提供了一份JESD204B同步机制的实战指南,重点聚焦于SYSREF信号的调试技巧。文章从同步的核心逻辑出发,深入剖析了时钟、SYSREF与对齐序列这“三驾马车”的协作,并详细阐述了硬件PCB布局、FPGA IP核配置、状态机监控以及使用示波器进行波形分析等关键实战步骤,旨在帮助工程师解决多通道高速系统中的同步难题,确保链路的稳定与确定性延迟。

weixin_29239661的博客 333

JNI的使用(以输出HelloWorld为例)

先说一下什么是JNI。JNI是Java Native Interface的缩写,中文为JAVA本地调用。JNI允许Java代码和其他语言写的代码进行交互。 以HelloWorld为例。 1、首先写Hello.java public class Hello {  public native void displayHelloWorld();//对本地的声明    static {   S

gaboolic的专栏 1032

电工电子实验——3BIT延时电路的设计与实现

设计一个 3BIT延时电路。 设计分析: Ⅰ.根据触发器的特性,只有来两个触发脉冲时才能恢复到原来的状态。也就是说触发器的输出信号比触发信号延迟了一个触发脉冲周期即1bit。据此3bit就需要3个触发器。 Ⅱ.输出要可控就要加一控制器,可用选择器实现。 Ⅲ.为便于观察输出信号的延迟,可设计一个F1信号。

qq_55543315的博客 1128

S/4HANA 迁移前的必修课:用 SCMON 找出沉睡的自定义代码

SAP S/4HANA迁移项目中,SCMON工具能有效解决历史代码评估难题。通过监控ABAP对象调用情况,SCMON可识别40-60%处于"沉睡"状态的自定义代码。配置时需注意监控周期(建议3-6个月)和数据保留期(建议1年),并配合Time Slices功能进行时段分析。工具导出的调用数据可与测试覆盖率对比,帮助决策代码迁移优先级。实际应用中需结合业务场景,建议与SUSG工具配合使用,并保持持续监控。SCMON虽不能完全替代人工判断,但其提供的客观数据能显著提升迁移决策的科学性,建议在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 292

Jni学习

Jni学习,待续。

LoveYooY的专栏 484

智能车图像处理24-进阶篇16--三叉路口的判断

这篇文章主要讲述图像处理中如何判断三叉路口并进行补线操作。

taiyuezyh的博客 1万+

推荐 JNi学习

推荐 JNi学习 http://blog.youkuaiyun.com/chenjie19891104/archive/2011/05/27/6450077.aspx

Cocos2d-x,Android,IOS,游戏,HTML5开发/交流/学习/资源 沈大海 1721

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jni学习

待续

笔记专栏 718

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

学习android JNI的那些事儿

边看官方资料边学习android JNI。 手册下载: http://download.youkuaiyun.com/detail/zhangjie201412/4092748 希望和大家一起学习android JNI。

zhangjie201412的专栏 3142

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

android JNI学习一

记录一下自己学习JNI的过程,目标是做一个小demo,实现apk简单调用C或C++语言,从而熟悉JNI过程。并记录错误。可以实现java调用C或C++语言,并且从C或C++回调java。 以下为个人观点,未必正确,可不参考。 JNI就是java调用本地方法的意思,具体来说就是android apk里java调用.so为后缀的库文件里的C或C++函数。 我个人认为java调用C有两种,一种是j

u013820413的专栏 626

JNI原理学习

根据方法名,将Java方法和JNI函数建立联系,它的缺点是:JNI层的函数名非常长,它是。

2301_79098336的博客 945

JNI入门学习总结

一、序言 NDK开发需要用到jni,项目中的第三方库经常有个.so文件有什么用,为啥加密不用java写呢?等等,我不知道...即使知道也仅仅是概念性的。现在我知道了!! 二、JNI的好处 两个字“装逼!!”,学了之后在同行看来会有种高大上的感觉,虽然自己心里知道很简单的,但是别人不会的东西,在他们眼里,就是高大上的。我有时很赞同:装逼就是一直学习新技术的动力。也是为了升职加薪,努力为

为梦拼命的Android攻城狮 1112

JNI 学习

使用 jni final和 private变量都能修改。1. JNI 不属于 C++,而是 JDK 的。日志失效,可以 adb kill-server。

m0_62538383的博客 176

JNI 学习笔记

JNI 学习笔记 1.概述 Java Native Interface(JNI) 是JDK提供的一个native编程接口。JNI 允许Java程序调用其他语言编写的程序或者代码库, 比如C/C++。Java 在内存管理和性能上有一定的局限,通过JNI我们就可以利用Native程序来克服这些限制。 2.一个简单的demo(JNI静态注册) 通过一个简单的Demo我们来看一下Native 与 ...

一路奔跑94的博客 258

JNI学习要点记录

JNI学习要点记录 - 简书

力开的博客 192

AndroidCmake:Android JNI案例学习Demo

AndroidCmake:Android JNI案例学习Demo 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在移动应用开发领域,Android平台上结合C/C++代码的能力为开发者提供了更广泛的性能优化空间。AndroidCmake项目正是一个专注于展示如何在Android Studio中使用Cmake构建JNI(Java Native Interface)案例的...

gitblog_06752的博客 957
上一篇: 知识点整理
下一篇: 各类滤波器比较 &amp;&amp;卷积理解
audiocool
博客等级 码龄9年 335粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值