首页
学习
活动
专区
圈层
工具
发布

Android 学习JNI,用JAVA调用C

首先必须知道JNI是什么东东? JNI(Java Native Interface)是java本地语言接口,也就是提供一种方法可以用JAVA调用底层语言(C/C++)。...一般如果项目必须使用C语言操作底层的硬件,那就必须用到JNI技术。 那既然要使用JAVA调用C语言,那必须要解决几个问题?...1:JAVA是面向对象的语言,而C是面向过程的语言 2:JAVA中的Object,String类型,Boolean类型,在C中都是没有的,那C语言是如何识别的?...注意:在学习JNI之前,需要在Google官网下载NDK安装,并且配置环境变量。 本次我们学习如何使用JAVA语言调用C语言,然后打印Hello World!...第一步: 建立一个Android Application工程 第二步:在项目根目录下建议一个文件夹,命名为jni 第三步:在jni文件夹中,创建一个C文件 第四步:在Java代码,创建一个本地方法:

91830

Android学习JNI,使用C调用JAVA语言

本节学习使用C语言调用JAVA语言。在生活中比如我们某些底层的硬件必须使用C语言去编写,当C语言返回的某些数值显示在界面上时,就比如使用JNI。这样可以将C返回的值显示在界面上。...里面就2个Button,一个用于开启监控,一个用于关闭监控,一个进度条 2:Activity代码如下: //开始监控button public void start(View v) { startMonitor...java的刷新进度条函数 public void showValue(int progress) { bar.setProgress(progress); } 3:本地JNI代码 #include...jni.h> #include #include int monitor = 1; //随机产生的值 int getPressure() { return...jclass cClass = (*env)->FindClass(env, "com/demo/ccalljava/MainActivity"); //2:找到方法id //show是调用java

61310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JNI使用过程记录,Java调用C++函数,JNI层使用和实例化Java对象

    近期提供给JAVA应用使用的编解码协议库,需求就是编码的字符串,需要解码为Java对象;回应消息的Java对象,需要编码为指定格式的字符串,把模板代码总结下,主要涉及几个点: 1、在JNI层找到Java...对象,及其属性变量的值,然后转换为JNI层的内存数据; 2、在JNI层实例化Java对象,并设置这个Java对象的属性变量,并返回这个Java对象; 示例代码如下: Java对象  public class...);       kmip_free_request_message(&ctx, &req_msg_client);     return jobj; } Java对象,输入到JNI层使用 public...层使用Java对象 //输入java对象,输出byte[]数组 JNIEXPORT jbyteArray JNICALL Java_com_xxx_ProtocolUtil_encodeTestKeyResponseMessage...基本类型与方法签名中参数类型和返回值类型的映射关系如下: 内存使用,关于局部引用和全局引用,讲的还是蛮清晰的:http://www.itpub.net/2020/01/02/4987/ Native

    93210

    Android系统JNI使用(JAVA调用C语言接口)一

    从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。...JNI一开始是为了本地已编语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。 使用java与本地已编译的代码交互,通常会丧失平台可移植性。...例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。...(3)本地代码可以运行在不同的JVM上面。 JDK1.1中第一次支持JNI,但是,JDK1.1仍在使用老风格的本地代码来实现JAVA的API。这种情况在JDK1.2下被彻底改变成符合标准的写法。...如何使用JNI 调用顺序: 编写带有native声明的方法的java类 编译所编写的java类 使用javah + java类名生成扩展名为h的头文件 将C/C++编写的文件生成动态连接库 Java基本数据类型与

    1.7K10

    写算法,用 C++ 还是用 Java ,差别大吗?

    C++ 语法层面使用的版本是 C++11之后的版本,Java 使用的标准是 Java6 之后的版本。...Java 的 long 比较单纯,无论是 32 位的系统还是 64 位的系统,它都表示 64 位整数。 ?...C++ 直接用 “ * ” 提领迭代器,得到对象本身的引用,Java 用迭代器的 next() 接口得到对象本身的引用。以上 C++ 代码可以翻译成如下 Java 代码: ?...C++ 还可以利用二维数组在内存中是连续存储这一特性,使用时用下标计算将一维数组当成二维数组使用,计算的方法是:a\[i]\[j] = b[i * 2 + j],如下代码示例: ?...当然,无论是 C++ 还是 Java,其 I/O 系统都非常复杂,有流式 I/O,也有缓冲区 I/O,操作的数据可以是控制台 I/O,也可以是文件 I/O。

    3.2K20

    网络研讨会视频:重构还是重写?聊聊 Java 代码臭味与重构技巧

    本次网路研讨会特别邀请到 Odd-e 敏捷教练张博超(Jackson)为大家演示如何用 IntelliJ IDEA 的重构功能来改善 Java 代码臭味。...重构与重写的差别又是什么?简单地说,重构就是在不改变外部行为的情况下,调整代码使其结构更合理或提升可读性。可是这样听起来,重写也能有一样的效果?...使用新语言更像是重写的范畴,因为你并不是在演进设计,而是在做一个很难撤消的技术决定。所以会建议将老系统拆分成小块的独立组件,以不会影响到主体的前提小规模的导入,这样在实现在会比较容易些。...而 Lambda Function 和 Exception Handling 其实并没有很直接的冲突,重点在于我们怎么使用 Exception,往往看到很多同学是随意地抛 Exception,这部份还是得根据不同的场景可能会有不同的作法...用这样的方式来开发程序,在维护或移植时,即可以让改动与依赖降到最低。

    84910

    从 Java 到 C++:用 JNI 实现字符串拼接全解析

    JNI 调用 C++ 的基础流程JNI 提供了一种在 Java 和本地代码(如 C++)之间交互的标准机制。...其核心流程如下:第一步:编写Java代码创建一个名为StringConcatenator.java的文件,声明本地方法,定义 Java 的 native 方法使用 native 关键字声明方法,仅需声明而无需实现...第二步:编译Java程序.java并生成C/C++头文件.h从 JDK 8 开始,应该使用“ javac -h ”来编译 Java 程序并生成名为JNI.h的 C/C++ 头文件,如下所示:javac...而 Java 中通过 JNI 调用的本地方法要求使用 C 风格的命名协议,函数名称必须与 JNI 头文件生成的声明完全一致。...经验总结代码实现总结Java层定义本地方法:通过native修饰符定义方法并加载动态链接库。C++实现核心逻辑:通过JNI接口与Java交互,实现高效的字符串操作。

    1K30

    JNI总结(一)

    JNI 是 Java平台中的一个强大特性。应用程序能够通过 JNI把 C/C++代码集成进 Java程序中。通过 JNI。开发人员在利用 Java平台强大功能的同一时候,又不必放弃对原有代码的投资。...浏览器就会把标签中的内容交给 Java VM 解释执行,这个实现,就是典型的把 JavaVM 嵌入 Browser 中。JNI 不仅仅是一套接口,还是一套使用规则。...学习 JNI编程是个漫长的实践过程,会碰到无数问题。 用 C/C++编程。...比方,应用程序运行中要使用 Java API 不支持的文件类型,而假设使用跨进程操作方式,即繁琐又低效避免进程间低效的数据拷贝操作多进程的派生:耗时、耗资源(内存)用本地代码或汇编代码重写Java 中低效方法...但这样的局面,没有持续非常久,在 Java 2 SDK release1.2 中 Java 层与本地代码的交互部分用 JNI 重写了。

    42610

    使用Java为何总写出C风格的代码?

    Java写的代码应该有Java的风格,而这种却处处体现着C风格。 1 编程范式(Programming paradigm) 程序的编写模式。使用什么编程范式,通常意味着主要使用的代码结构。...2 多范式编程 编程范式与具体语言的关系不大,就好比你的思考与用什么语言表达是无关的。但实际每种语言都有自己的主流编程范式。 如C语言主要是结构化编程,而 Java主要是面向对象编程。...C是一门典型的结构化编程语言,而VFS的设计展现出来的却是面向对象编程的特点,编程范式的“次元壁”在这里被打破。 类似的设计还有很多,比如,Java里有一个著名的基础库,Google出的Guava。...在Java 8之前,Java在语法上并不支持函数式编程,但这并不妨碍我们通过类模拟函数。 C++有一个functor概念,也就是函数对象,通过重载 () 这个运算符,让对象模拟函数的行为。...Java从Java 8开始引入了Lambda语法,写出函数式编程代码。 多范式编程会越来越多,是因为关注点是做出好的设计,写出易维护代码,所以,我们会尝试着把不同编程风格中优秀的元素放在一起。

    58830

    JNI动态注册native方法及JNI数据使用

    JNI实现步骤 JNI 开发流程主要分为以下步骤: 编写声明了 native 方法的 Java 类 将 Java 源代码编译成 class 字节码文件 用 javah -jni 命令生成.h头文件(javah...是 jdk 自带的一个命令,-jni 参数表示将 class 中用native 声明的函数生成 JNI 规则的函数) 用本地代码(c/c++)实现.h头文件中的函数 将(c/c++)文件编译成动态库(...我们安卓开发工程师显然只需要编写native的java类,然后clean下编译器知道把我们的java编译成了class文件,但是我们必须知道是调用了javac命令,javah jni命令我们还是得执行,...然后 #ifdef __cplusplus  extern “C” {#endif 这是说明如果宏定义了c++,并且里面有c我们还是支持c的,并且c代码写extern “C” {}里面。...总结 本篇主要介绍了JNI动态注册native方法,并且顺便截了几个jni的图,以及使用的基本数据转换处理,至于实际应用中比如java 调用c,c调用java以及混合调用等我们都需要实践中去处理问题。

    1.6K60

    什么是动态注册?什么是静态注册?

    优点: 开发简单 缺点: JNI函数名非常长 捆绑 上层 包名 + 类名 运行期 才会去 匹配JNI函数,性能上 低于 动态注册 动态注册 再看Android Framework源代码的Native...明白一个简单的道理,Java中我们new 类,默认会调用构造函数,重写了构造函数,就会调用我们自己的。...NDK中Jni函数也是这样,默认会有JNI_OnLoad 一系列函数,我们重写JNI_OnLoad来加载我们自己的逻辑。...当我们调用,System.loadLiberary("xxxxx"); 实际上自动调用了JNI_OnLoad 做动态注册 先看下示例代码 ➜ Java 部分 public native...,C 中封装库都是成功就是0 AS的JDK目前JNI默认最高1.6 和 Java的JDK的JNI 1.8不同 JNI_OK 就是JNI提供的一些宏定义方便使用。

    2.4K10

    JVM怎样使Native Method,为什么要使用Native Method,Java语言如何与本地代码(CC++)交互,JNI与NDK与sdk

    通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。...,仅仅需要开发IDE (2)jni:java与本地代码(c/c++)通过jni交互 (3)常见使用NDK的平台,TV——电视机,STB——机顶盒,IVI——车载系统,AR——虚拟现实,手机端游戏等。...(2)已经存在使用C/C++等其他语言开发好的库,需要使用JNI来访问他们,例如游戏引擎Cocos2d-X (3)需要优化其中一部分的源代码,提升整体性能。...(这个程序可以重写并且重新编译这样就可以用新的处理器执行本机模式了。)...Java调C、C++(jni接口),是一些java如何调C的代码。它会把C代码编译成一个.SO的动态库,通过jni接口用java代码去调用它,有了它我们可以直接在android代码中去添加C代码。

    41710

    将 GPU 级性能带到企业级 Java:CUDA 集成实用指南

    它非常适合原型或试验,但通常需要手动内存管理,可能限制其在生产中的使用。 Java 本地接口(JNI)通过允许你用 C++ 编写 CUDA 内核并暴露给 Java,提供更强的控制与通常更优的性能。...JNI 桥 JNI 是连接 Java 与本地 C++ 代码(包含 CUDA 逻辑)的桥梁。它负责声明本地方法、加载共享本地库(.so、.dll)、并在 Java 堆与本地缓冲区之间传递内存。...内核用 .cu 文件编写,使用 CUDA C API,并通过熟悉的 >> 语法启动。...编写包含本地方法并通过 System.loadLibrary() 加载库的 Java 类 • 在 Java 与本地代码之间干净地处理输入/输出与异常 企业用例——用 Java 与 CUDA 加速批量数据加密...Java 与本地代码的数据编组 通过 JNI 在 Java 与 C/C++ 之间传递数据不只是语法问题;若处理不当会成为严重的性能瓶颈。

    14610

    那位用Rust重写数据库的创始人来复盘了:删除27万行C++代码,值吗?

    这与编程语言的选择没有太大关系,开发一款数据库可以用各种各样的语言,比如 C++、Rust、Java,Scala 等,一些交易系统相关的可能还会考虑 Haskell,但即便是在 20 年之前的数据库,也鲜少有人使用...吴英骏:我本人比较擅长 C++,不管是读博期间还是创业之前做的所有数据库都是用 C++ 写的,没有用过其他任何语言写过任何项目。...其次,依赖管理很痛苦,虽然 CMake 工具可以自动配置 C++ 项目的编译,但使用起来还是很麻烦的,仍然需要手动配置和安装依赖库;STL 库缺乏对一些现代编程工具的支持,依赖的社区项目大多数还都缺乏长期支持...InfoQ:C++ 代码风格不统一的问题,用 Rust 重写以后就不存在这个问题了吗?...吴英骏:团队中有部分工程师之前就懂 Rust,只是未在工作中使用,这部分工程师还是比较容易转型的。

    1.2K10

    Java跨语言调用,使用JNA访问Java外部接口

    JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。...可以看到步骤减少了很多,最重要的是我们不需要重写我们的动态链接库文件,而是有直接调用的API,大大简化了我们的工作量。 JNA只需要我们写Java代码而不用写JNI或本地代码。...原来使用JNI,你必须手工用C写一个动态链接库,在C语言中映射Java的数据类型。...使用JNI技术,不仅可以实现Java访问C函数,也可以实现C语言调用Java代码。 而JNA只能实现Java访问C函数,作为一个Java框架,自然不能实现C语言调用Java代码。...此时,你还是需要使用JNI技术。 JNI是JNA的基础,是Java和C互操作的技术基础。有时候,你必须回归到基础上来。

    5.3K21

    Java关键字——native

    JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。...②、程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。    ...目前来讲使用 JNI 的缺点相对于优点还是可以接受的,可能后面随着 Java 的技术发展,我们不在需要 JNI,但是目前 JDK 还是一直提供对 JNI 标准的支持。...3、用C语言编写程序本地方法   上面讲解了什么是 JNI,那么我们接下来就写个例子,如何用 Java 代码调用本地的 C 程序。   ...-jni  java类名 生成扩展名为 h 的头文件,也即生成.h文件;   ④、使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法;

    2.1K131
    领券