JavaCPP 技术使用经验总结

本文是对 JNI 技术的一个补充方法,提出了替换 JNI、JNA 的一种开源技术。首先对 JavaCPP 技术进行简单介绍及对应于其他现有方案的介绍、对比。接下来,通过一个简单的示例让大家了解 JavaCPP 的工作原理。然后,介绍了 JavaCPP presets 子项目,最后通过若干个针对 presets 的示例来让大家了解如何使用它,本文主要提出了替换 JNI 的一种编程实现方式。

JavaCPP 简介

JavaCPP 是一个开源库,它提供了在 Java 中高效访问本地 C++的方法。采用 JNI 技术实现,所以支持所有 Java 实现包括 Android 系统,Avian 和 RoboVM。

  • Android

一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。

  • Avian

Avian 是一个轻量级的 Java 虚拟机和类库,提供了 Java 特性的一个有用的子集,适合开发跨平台、自包容的应用程序。它实现非常快速而且体积小,主要特性包括如下四点:

  1. 类似于 HotSpot JVM 的 JIT 编译器,支持快速方法执行;
  2. 采用 JVM 的复制算法,即将现有的内存空间分为两快,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。这样可以确保内存回收过程中内存暂停服务的时间较短,并且内存的使用空间局限性较小;
  3. JVM 内存区域里面的本地栈快速分配,没有同步开销;
  4. 操作系统信号量方式解决了空指针问题,避免了不必要的分支。
  • RoboVM

RoboVM 编译器可以将 Java 字节码翻译成 ARM 或者 x86 平台上的原生代码,应用可直接在 CPU 上运行,无需其他解释器或者虚拟机。RoboVM 同时包含一个 Java 到 Objective-C 的桥,可像其他 Java 对象一样来使用 Objective-C 对象。大多数 UIKit 已经支持,而且将会支持更多的框架。

总的来说,JavaCPP 提供了一系列的 Annotation 将 Java 代码映射到 C++代码,并使用一个可执行的 jar 包将 C++代码转化为可以从 JVM 内调用的动态链接库文件。

与其他技术相比,特性总结如下表 1 所示。

表 1. 类似技术介绍或特点
技术名称 技术介绍
CableSwig 用于针对 Tcl 和 Python 语言创建接口
JNIGeneratorApp 所有用于 SWT 的 C 代码都是通过它来创建的
cxxwrap 用于生成针对 C++的 Java JNI 包、HTML 文档、用户手册
JNIWrapper 商业版本,可以帮助实现 Java 和本地代码之间的无缝结合
Platform Invoke 微软发布的一个工具
GlueGen 针对 C 语言的一个工具,帮助生成 JNI 代码
LWJGL Generator JNI 代码生成器
ctypes 针对 Python 的接口代码生成器
JNA JNA(Java Native Access)提供一组 Java 工具类用于在运行期动态访问系统本地库(native library:如 Window 的 dll)而不需要编写任何 Native/JNI 代码。开发人员只要在一个 Java 接口中描述目标 native library 的函数与结构,JNA 将自动实现 Java 接口到 native function 的映射。
JNIEasy 替换 JNA 的一种技术
JNative Windows 版本的库 (DLL),提供了 JNI 代码生成
fficxx 针对 haskell 模型的代码生成器,主要生成 C 语言
JavaCPP 更加自然高效,它支持大部分的 C++语法特性。目前已经能成功封装 OpenCV, FFmpeg, libdc1394, PGR FlyCapture, OpenKinect, videoInput, and ARToolKitPlus。除此之外,它还能直接把 C/C++的头文件转化成 Java 类,能自动生成 JNI 代码,编译成本地库,开发人员无需编写繁琐的 C++、JNI 代码,从而提高开发效率。

回页首

JavaCPP 示例

为了调用本地方法,JavaCPP 生成了对应的 JNI 代码,并且把这些代码输入到 C++编译器,用来构建本地库。使用了 Annotations 特性的 Java 代码在运行时会自动调用 Loader.load() 方法从 Java 资源里载入本地库,这里指的资源是工程构建过程中配置好的。

我们先来演示一个例子,这是一个简单的注入/读出方法,类似于 JavaBean 的工作方式。清单 1 所示的 LegacyLibrary.h 包含了 C++类。

清单 1. LegacyLibrary.h
#include <string>

namespace LegacyLibrary {
 class LegacyClass {
 public:
 const std::string& get_property() { return property; }
 void set_property(const std::string& property) { this->property = property; }
 std::string property;
 };
}

接下来定义一个 Java 类,驱动 JavaCPP 来完成调用 C++代码。

清单 2. LegacyLibrary.java
import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.annotation.*;

@Platform(include="LegacyLibrary.h")
@Namespace("LegacyLibrary")
public class LegacyLibrary {
 public static class LegacyClass extends Pointer {
 static { Loader.load(); }
 public LegacyClass() { allocate(); }
 private native void allocate();

 // to call the getter and setter functions
 public native @StdString String get_property(); public native void set_property(String property);

 // to access the member variable directly
 public native @StdString String property(); public native void property(String property);
 }

 public static void main(String[] args) {
 // Pointer objects allocated in Java get deallocated once they become unreachable,
 // but C++ destructors can still be called in a timely fashion with Pointer.deallocate()
 LegacyClass l = new LegacyClass();
 l.set_property("Hello World!");
 System.out.println(l.property());
 }
}

以上两个类放在一个目录下面,接下来运行一系列编译指令,如清单 3 所示。

清单 3. 运行命令
$ javac -cp javacpp.jar LegacyLibrary.java
$ java -jar javacpp.jar LegacyLibrary
$ java -cp javacpp.jar LegacyLibrary
Hello World!

我们看到清单 3 最后运行输出了一行“Hello World!”,这是 LegacyLibrary 类里面定义好的,通过一个 setter 方法注入字符串,getter 方法读出字符串。

我们可以看到文件夹里面内容的变化,刚开始的时候只有.h、.java 两个文件,清单 3 所示的 3 个命令运行过后,生成了 class 文件及本地方法 (native method) 对应的.so 文件。

http://www.ibm.com/developerworks/cn/java/j-lo-cpp/

时间: 2024-08-10 00:07:02

JavaCPP 技术使用经验总结的相关文章

虚拟化技术的实际使用经验分享

根据美国<CIO>杂志对于虚拟化技术(Virtualization)的第一手调查,你可能已实际使用过虚拟化技术,而且也满意目前为止它所带来的投资回报率.但是这个今日最热门的IT技术,却也引起棘手的技术与政治挑战,令你头痛不已. 最大的挑战――首先,算出在不降低“应用程序服务等级(Application Service Levels)”的情况下,你能借助使用更多的虚拟机器(Virtual Machine,VM)而省掉的实际物理服务器数量.其次,集结各个IT部门的专家,一起规划并管理虚拟化环境.I

大数据入门:各种大数据技术介绍

转自:http://www.aboutyun.com/thread-7569-1-1.html 大数据我们都知道hadoop,可是还会各种各样的技术进入我们的视野:Spark,Storm,impala,让我们都反映不过来.为了能够更好的架构大数据项目,这里整理一下,供技术人员,项目经理,架构师选择合适的技术,了解大数据各种技术之间的关系,选择合适的语言.我们可以带着下面问题来阅读本文章:1.hadoop都包含什么技术2.Cloudera公司与hadoop的关系是什么,都有什么产品,产品有什么特性

【科普】#001 大数据相关技术技术

由于不是大数据的开发人员,因此对大数据的知识,也就只是需要简单的理解,大数据有什么技术,都有什么用,这样就够了 大数据我们都知道hadoop,可是还会各种各样的技术进入我们的视野:Spark,Storm,impala,让我们都反映不过来.为了能够更好的架构大数据项目,这里整理一下,供技术人员,项目经理,架构师选择合适的技术,了解大数据各种技术之间的关系,选择合适的语言. 我们可以带着下面问题来阅读本文章: 1.hadoop都包含什么技术2.Cloudera公司与hadoop的关系是什么,都有什么

【开源】浅谈Hybrid技术的设计与实现第二弹

前言 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) PS:据说加个开源在前面阅读量高点,于是就试试咯...... 上文说了很多关于Hybrid的概要设计,可以算得上大而全,有说明有demo有代码,对于想接触Hybrid的朋友来说应该有一定帮助,但是对于进阶的朋友可能就不太满足了,他们会想了解其中的每一个细节,甚至是一些Native的实现,小钗这里继续抛砖引玉,希望接下来的内容对各位有一定帮助. 进入今天的内容之前我们首先谈谈两个相关技术Ionic与React Nativ

计算机技术领域当前的技术及其社会需求调查报告

(1)测试领域当前的发展状况. 全国计算机应用专业人才的需求每年将增加100万人左右. 计算机科学与技术中的测试领域在中国发展的步履上布满了荆棘与泥泞,然而其发展速度可谓惊人.测试工程师,软件质量的把关者,工作起点高,发展空间大.我国的软件测试职业还处于一个发展的阶段,所以测试工程师具有较大发展前景.软件测试职业发展方向,大体上与上述的通用职业发展路线图相吻合,也可以分为管理路线.技术路线.管理技术路线.目前传统的软件行业还是以软件测试工程师为主,但是在新兴的互联网行业大多还是以QA来命名这个职

大数据架构师基础:hadoop家族,Cloudera产品系列等各种技术

大数据我们都知道hadoop,可是还会各种各样的技术进入我们的视野:Spark,Storm,impala,让我们都反映不过来.为了能够更好的架构大数据项目,这里整理一下,供技术人员,项目经理,架构师选择合适的技术,了解大数据各种技术之间的关系,选择合适的语言. 我们可以带着下面问题来阅读本文章: 1.hadoop都包含什么技术 2.Cloudera公司与hadoop的关系是什么,都有什么产品,产品有什么特性 3. Spark与hadoop的关联是什么? 4. Storm与hadoop的关联是什么

Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)

Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对象受到对象动态绑定机制的限制使得DLL 在封装对象方面有一定的技术难度导致有些Delphi 程序员误以为DLL 只支持封装函数不支持封装对象本文着重介绍了DLL 中封装和调用对象的原理和思路并结合实例给出了多种不同的实现方法关键字动态链接库DLL 对象接口虚方法动态绑定类引用面向对象1 物理封装与动

Node.js背后的V8引擎优化技术

Node.js的执行速度远超Ruby.Python等脚本语言,这背后都是V8引擎的功劳.本文将介绍如何编写高性能Node.js代码.V8是Chrome背后的JavaScript引擎,因此本文的相关优化经验也适用于基于Chrome浏览器的JavaScript引擎. V8优化技术概述 V8引擎在虚拟机与语言性能优化上做了很多工作.不过按照Lars Bak的说法,所有这些优化技术都不是他们创造的,只是在前人的基础上做的改进. 隐藏类(Hidden Class) 为了减少JavaScript中访问属性所

iOS开发ARC内存管理技术要点

本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验.详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:) 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging 技术交流新QQ群:41