首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Java重写C代码还是使用JNI?

用Java重写C代码还是使用JNI?

Java和JNI都是Java编程语言中的技术,但它们的应用场景和目的不同。

Java是一种面向对象的编程语言,它通过运行在Java虚拟机(JVM)上的字节码来运行。Java的主要优势在于其跨平台性和可移植性,可以在不同的操作系统和设备上运行,而且由于其封闭的内存管理和垃圾回收机制,Java应用程序通常运行得更快,也更可靠。

JNI(Java Native Interface)是Java平台上的本地编程接口,允许Java应用程序与其他编程语言(如C、C++、Python等)编写的本地库进行交互。JNI主要用于调用本地方法,例如在C或C++中实现的函数,这些函数需要被Java应用程序调用,并且需要与Java环境进行交互。

如果要从C代码中调用Java方法,使用JNI是更合适的选择,因为JNI可以更好地与Java环境集成,并且可以更轻松地实现跨平台性。使用JNI,你可以编写C代码来调用Java方法,这些方法可以是Java平台的标准库方法,也可以是你自己定义的Java方法。

总的来说,使用JNI还是Java重写C代码,取决于你的具体需求和目标。如果你想要编写跨平台的应用程序,并且需要与Java环境进行交互,那么使用JNI可能是更好的选择。如果你只是想要编写C代码,那么使用Java重写C代码可能并不是最好的选择,因为Java的语法和特性与C语言有很大的不同,这可能会导致代码的可读性和可维护性降低。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android 学习JNIJAVA调用C

首先必须知道JNI是什么东东? JNIJava 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代码,创建一个本地方法:

68230

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... #include #include int monitor = 1; //随机产生的值 int getPressure() { return...jclass cClass = (*env)->FindClass(env, "com/demo/ccalljava/MainActivity"); //2:找到方法id //show是调用java

39210
  • 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

    57910

    写算法, 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。

    2.8K20

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

    Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。...JNI一开始是为了本地已编语言,尤其是CC++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。 使用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.4K10

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

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

    71610

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

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

    41230

    JNI总结(一)

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

    27110

    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.3K60

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

    优点: 开发简单 缺点: 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提供的一些宏定义方便使用

    2K10

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

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

    87610

    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的基础,是JavaC互操作的技术基础。有时候,你必须回归到基础上来。

    4.4K21

    AI实现C++、Java、Python代码互译,运行成功率最高达80.9%

    下图展示了C++、Java和Python关键字的嵌入。在相似的上下文中使用的不同编程语言的关键字在嵌入空间中非常接近。 ?...TransCoder推断变量和函数返回值的类型,将Python的deque()容器映射到C++中类似的实现deque,并使用C++的front、back、pop_back和push_back方法来检索和插入...deque中的元素,而不是使用Python方括号、pop和append方法。...和自然语言不同的是,代码翻译并不太要求逐字逐句的对照,因此翻译后的代码和参考代码的重合度其实很低,比如C++转Java代码和Ground Truth仅有3.1%匹配。...以此为标准,C++转Java代码的计算正确率为60.9%,而JavaC++的计算正确率为80.9 %。 Facebook不是唯一开发AI代码生成系统的公司。

    85450

    AI实现C++、Java、Python代码互译,运行成功率最高达80.9%

    下图展示了C++、Java和Python关键字的嵌入。在相似的上下文中使用的不同编程语言的关键字在嵌入空间中非常接近。 ?...TransCoder推断变量和函数返回值的类型,将Python的deque()容器映射到C++中类似的实现deque,并使用C++的front、back、pop_back和push_back方法来检索和插入...deque中的元素,而不是使用Python方括号、pop和append方法。...和自然语言不同的是,代码翻译并不太要求逐字逐句的对照,因此翻译后的代码和参考代码的重合度其实很低,比如C++转Java代码和Ground Truth仅有3.1%匹配。...以此为标准,C++转Java代码的计算正确率为60.9%,而JavaC++的计算正确率为80.9 %。 Facebook不是唯一开发AI代码生成系统的公司。

    74020

    Java关键字——native

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

    1.9K131

    Android签名攻与防

    Android签名背景 Android应用使用应用包文件(.apk文件)的形式分发到设备上,由于这个平台的程序主要是 Java 编写的,所以这种格式与 Java 包的格式 -- jar(Java Archive...JNI注册方式 JNI全称是Java Native Interface(Java本地接口)单词首字母的缩写,本地接口就是指用CC++开发的接口。...由于JNI是JVM规范中的一部份,因此可以将我们写的JNI程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前C/C++写的大量代码。...使用Javah命令生成C/C++的头文件,例如:javah -jni com.jd.jnidemo.MainActivity,则会生成一个以.h为后缀的文件com_jd_jnidemo_MainActivity.h...Java程序都可以使用jni反射在native实现,Java代码太容易破解,不建议防止到Java端。

    2.2K50
    领券