blob: 7eea1cf6b42ff14517fb6f39792eec89badd578b [file] [log] [blame]
<!DOCTYPE html>
<html lang="en" data-content_root="" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>C Data Interface &#8212; Apache Arrow v17.0.0.dev52</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../_static/theme_overrides.css" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/clipboard.min.js"></script>
<script src="../_static/copybutton.js"></script>
<script src="../_static/design-tabs.js"></script>
<script>DOCUMENTATION_OPTIONS.pagename = 'java/cdata';</script>
<script>
DOCUMENTATION_OPTIONS.theme_version = '0.15.2';
DOCUMENTATION_OPTIONS.theme_switcher_json_url = '/docs/_static/versions.json';
DOCUMENTATION_OPTIONS.theme_switcher_version_match = 'dev/';
DOCUMENTATION_OPTIONS.show_version_warning_banner = true;
</script>
<link rel="canonical" href="https://arrow.apache.org/docs/java/cdata.html" />
<link rel="icon" href="../_static/favicon.ico"/>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Arrow JDBC Adapter" href="jdbc.html" />
<link rel="prev" title="Substrait" href="substrait.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '20']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../index.html">
<img src="../_static/arrow.png" class="logo__image only-light" alt="Apache Arrow v17.0.0.dev52 - Home"/>
<script>document.write(`<img src="../_static/arrow-dark.png" class="logo__image only-dark" alt="Apache Arrow v17.0.0.dev52 - Home"/>`);</script>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../format/index.html">
Specifications
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../developers/index.html">
Development
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
Implementations
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../c_glib/index.html">
C/GLib
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../cpp/index.html">
C++
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/csharp/README.md">
C#
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://pkg.go.dev/github.com/apache/arrow/go/v17">
Go
</a>
</li>
<li class="nav-item current active">
<a class="nav-link dropdown-item nav-internal" href="index.html">
Java
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../js/index.html">
JavaScript
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/julia/">
Julia
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/matlab/README.md">
MATLAB
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/nanoarrow/">
nanoarrow
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../python/index.html">
Python
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../r/index.html">
R
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/ruby/README.md">
Ruby
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://docs.rs/crate/arrow/">
Rust
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../status.html">
Implementation Status
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/cpp/">
C++ cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/java/">
Java cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/py/">
Python cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/r/">
R cookbook
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<div class="version-switcher__container dropdown">
<button id="pst-version-switcher-button-2"
type="button"
class="version-switcher__button btn btn-sm navbar-btn dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-2"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-2"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-2">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div>
`);
</script></div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
<div class="navbar-item"><ul class="navbar-icon-links navbar-nav"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://github.com/apache/arrow" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">GitHub</span></a>
</li>
<li class="nav-item">
<a href="https://twitter.com/ApacheArrow" title="X" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-x-twitter fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">X</span></a>
</li>
</ul></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<label class="sidebar-toggle secondary-toggle" for="__secondary" tabindex="0">
<span class="fa-solid fa-outdent"></span>
</label>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../format/index.html">
Specifications
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../developers/index.html">
Development
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
Implementations
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../c_glib/index.html">
C/GLib
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../cpp/index.html">
C++
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/csharp/README.md">
C#
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://pkg.go.dev/github.com/apache/arrow/go/v17">
Go
</a>
</li>
<li class="nav-item current active">
<a class="nav-link dropdown-item nav-internal" href="index.html">
Java
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../js/index.html">
JavaScript
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/julia/">
Julia
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/matlab/README.md">
MATLAB
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/nanoarrow/">
nanoarrow
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../python/index.html">
Python
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../r/index.html">
R
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/ruby/README.md">
Ruby
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://docs.rs/crate/arrow/">
Rust
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../status.html">
Implementation Status
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/cpp/">
C++ cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/java/">
Java cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/py/">
Python cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/r/">
R cookbook
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<div class="version-switcher__container dropdown">
<button id="pst-version-switcher-button-3"
type="button"
class="version-switcher__button btn btn-sm navbar-btn dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-3"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-3"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-3">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div>
`);
</script></div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
<div class="navbar-item"><ul class="navbar-icon-links navbar-nav"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://github.com/apache/arrow" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">GitHub</span></a>
</li>
<li class="nav-item">
<a href="https://twitter.com/ApacheArrow" title="X" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-x-twitter fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">X</span></a>
</li>
</ul></div>
</div>
</div>
<div class="sidebar-primary-items__start sidebar-primary__section">
<div class="sidebar-primary-item">
<nav class="bd-docs-nav bd-links"
aria-label="Section Navigation">
<p class="bd-links__title" role="heading" aria-level="1">Section Navigation</p>
<div class="bd-toc-item navbar-nav"><ul class="current nav bd-sidenav">
<li class="toctree-l1"><a class="reference internal" href="quickstartguide.html">Quick Start Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="overview.html">High-Level Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installing Java Modules</a></li>
<li class="toctree-l1"><a class="reference internal" href="memory.html">Memory Management</a></li>
<li class="toctree-l1"><a class="reference internal" href="vector.html">ValueVector</a></li>
<li class="toctree-l1"><a class="reference internal" href="vector_schema_root.html">Tabular Data</a></li>
<li class="toctree-l1"><a class="reference internal" href="table.html">Table</a></li>
<li class="toctree-l1"><a class="reference internal" href="ipc.html">Reading/Writing IPC formats</a></li>
<li class="toctree-l1"><a class="reference internal" href="algorithm.html">Java Algorithms</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight.html">Arrow Flight RPC</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight_sql.html">Arrow Flight SQL</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight_sql_jdbc_driver.html">Arrow Flight SQL JDBC Driver</a></li>
<li class="toctree-l1"><a class="reference internal" href="dataset.html">Dataset</a></li>
<li class="toctree-l1"><a class="reference internal" href="substrait.html">Substrait</a></li>
<li class="toctree-l1 current active"><a class="current reference internal" href="#">C Data Interface</a></li>
<li class="toctree-l1"><a class="reference internal" href="jdbc.html">Arrow JDBC Adapter</a></li>
<li class="toctree-l1"><a class="reference internal" href="reference/index.html">Reference (javadoc)</a></li>
<li class="toctree-l1"><a class="reference external" href="https://arrow.apache.org/cookbook/java/">Java cookbook</a></li>
</ul>
</div>
</nav></div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="index.html" class="nav-link">Java Implementation</a></li>
<li class="breadcrumb-item active" aria-current="page">C Data Interface</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="c-data-interface">
<h1><a class="toc-backref" href="#id1" role="doc-backlink">C Data Interface</a><a class="headerlink" href="#c-data-interface" title="Permalink to this heading">#</a></h1>
<nav class="contents" id="contents">
<p class="topic-title">Contents</p>
<ul class="simple">
<li><p><a class="reference internal" href="#c-data-interface" id="id1">C Data Interface</a></p>
<ul>
<li><p><a class="reference internal" href="#java-to-python" id="id2">Java to Python</a></p></li>
<li><p><a class="reference internal" href="#java-to-c" id="id3">Java to C++</a></p>
<ul>
<li><p><a class="reference internal" href="#share-an-int64-array-from-c-to-java" id="id4">Share an Int64 array from C++ to Java</a></p></li>
<li><p><a class="reference internal" href="#share-an-int32-array-from-java-to-c" id="id5">Share an Int32 array from Java to C++</a></p></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
<p>Arrow supports exchanging data without copying or serialization within the same process
through the <a class="reference internal" href="../format/CDataInterface.html#c-data-interface"><span class="std std-ref">The Arrow C data interface</span></a>, even between different language runtimes.</p>
<section id="java-to-python">
<h2><a class="toc-backref" href="#id2" role="doc-backlink">Java to Python</a><a class="headerlink" href="#java-to-python" title="Permalink to this heading">#</a></h2>
<p>See <a class="reference internal" href="../python/integration/python_java.html"><span class="doc">Integrating PyArrow with Java</span></a> to implement Java to
Python communication using the C Data Interface.</p>
</section>
<section id="java-to-c">
<h2><a class="toc-backref" href="#id3" role="doc-backlink">Java to C++</a><a class="headerlink" href="#java-to-c" title="Permalink to this heading">#</a></h2>
<p>See <a class="reference internal" href="../developers/cpp/building.html"><span class="doc">Building Arrow C++</span></a> to build the Arrow C++ libraries:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/apache/arrow.git
$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>arrow/cpp
$<span class="w"> </span>mkdir<span class="w"> </span>build<span class="w"> </span><span class="c1"># from inside the `cpp` subdirectory</span>
$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>build
$<span class="w"> </span>cmake<span class="w"> </span>..<span class="w"> </span>--preset<span class="w"> </span>ninja-debug-minimal
$<span class="w"> </span>cmake<span class="w"> </span>--build<span class="w"> </span>.
$<span class="w"> </span>tree<span class="w"> </span>debug/
debug/
├──<span class="w"> </span>libarrow.800.0.0.dylib
├──<span class="w"> </span>libarrow.800.dylib<span class="w"> </span>-&gt;<span class="w"> </span>libarrow.800.0.0.dylib
└──<span class="w"> </span>libarrow.dylib<span class="w"> </span>-&gt;<span class="w"> </span>libarrow.800.dylib
</pre></div>
</div>
<section id="share-an-int64-array-from-c-to-java">
<h3><a class="toc-backref" href="#id4" role="doc-backlink">Share an Int64 array from C++ to Java</a><a class="headerlink" href="#share-an-int64-array-from-c-to-java" title="Permalink to this heading">#</a></h3>
<p><strong>C++ Side</strong></p>
<p>Implement a function in CDataCppBridge.h that exports an array via the C Data Interface:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;iostream&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/api.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/c/bridge.h&gt;</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">FillInt64Array</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">uintptr_t</span><span class="w"> </span><span class="n">c_schema_ptr</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uintptr_t</span><span class="w"> </span><span class="n">c_array_ptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Builder</span><span class="w"> </span><span class="n">builder</span><span class="p">;</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">AppendNull</span><span class="p">();</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="mi">7</span><span class="p">);</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="mi">8</span><span class="p">);</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="mi">9</span><span class="p">);</span>
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Array</span><span class="o">&gt;</span><span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">*</span><span class="n">builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">();</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ArrowSchema</span><span class="o">*</span><span class="w"> </span><span class="n">c_schema</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="k">struct</span><span class="w"> </span><span class="nc">ArrowSchema</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">c_schema_ptr</span><span class="p">);</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">c_schema_status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ExportType</span><span class="p">(</span><span class="o">*</span><span class="n">array</span><span class="o">-&gt;</span><span class="n">type</span><span class="p">(),</span><span class="w"> </span><span class="n">c_schema</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">c_schema_status</span><span class="p">.</span><span class="n">ok</span><span class="p">())</span><span class="w"> </span><span class="n">c_schema_status</span><span class="p">.</span><span class="n">Abort</span><span class="p">();</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ArrowArray</span><span class="o">*</span><span class="w"> </span><span class="n">c_array</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="k">struct</span><span class="w"> </span><span class="nc">ArrowArray</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">c_array_ptr</span><span class="p">);</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">c_array_status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ExportArray</span><span class="p">(</span><span class="o">*</span><span class="n">array</span><span class="p">,</span><span class="w"> </span><span class="n">c_array</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">c_array_status</span><span class="p">.</span><span class="n">ok</span><span class="p">())</span><span class="w"> </span><span class="n">c_array_status</span><span class="p">.</span><span class="n">Abort</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
</div>
<p><strong>Java Side</strong></p>
<p>For this example, we will use <a class="reference external" href="https://github.com/bytedeco/javacpp">JavaCPP</a> to call our C++ function from Java,
without writing JNI bindings ourselves.</p>
<div class="highlight-xml notranslate"><div class="highlight"><pre><span></span><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
<span class="nt">&lt;project</span><span class="w"> </span><span class="na">xmlns=</span><span class="s">&quot;http://maven.apache.org/POM/4.0.0&quot;</span>
<span class="w"> </span><span class="na">xmlns:xsi=</span><span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span>
<span class="w"> </span><span class="na">xsi:schemaLocation=</span><span class="s">&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;</span><span class="nt">&gt;</span>
<span class="w"> </span><span class="nt">&lt;modelVersion&gt;</span>4.0.0<span class="nt">&lt;/modelVersion&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.example<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>java-cdata-example<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>1.0-SNAPSHOT<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;properties&gt;</span>
<span class="w"> </span><span class="nt">&lt;maven.compiler.source&gt;</span>8<span class="nt">&lt;/maven.compiler.source&gt;</span>
<span class="w"> </span><span class="nt">&lt;maven.compiler.target&gt;</span>8<span class="nt">&lt;/maven.compiler.target&gt;</span>
<span class="w"> </span><span class="nt">&lt;arrow.version&gt;</span>9.0.0<span class="nt">&lt;/arrow.version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/properties&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependencies&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.bytedeco<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>javacpp<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>1.5.7<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.apache.arrow<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>arrow-c-data<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>${arrow.version}<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.apache.arrow<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>arrow-vector<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>${arrow.version}<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.apache.arrow<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>arrow-memory-core<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>${arrow.version}<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.apache.arrow<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>arrow-memory-netty<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>${arrow.version}<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.apache.arrow<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>arrow-format<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>${arrow.version}<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependencies&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</pre></div>
</div>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">org.bytedeco.javacpp.annotation.Platform</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.bytedeco.javacpp.annotation.Properties</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.bytedeco.javacpp.tools.InfoMap</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.bytedeco.javacpp.tools.InfoMapper</span><span class="p">;</span>
<span class="nd">@Properties</span><span class="p">(</span>
<span class="w"> </span><span class="n">target</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;CDataJavaToCppExample&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nd">@Platform</span><span class="p">(</span>
<span class="w"> </span><span class="n">include</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="s">&quot;CDataCppBridge.h&quot;</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="n">compiler</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s">&quot;cpp17&quot;</span><span class="p">},</span>
<span class="w"> </span><span class="n">linkpath</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s">&quot;/arrow/cpp/build/debug/&quot;</span><span class="p">},</span>
<span class="w"> </span><span class="n">link</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s">&quot;arrow&quot;</span><span class="p">}</span>
<span class="w"> </span><span class="p">)</span>
<span class="p">)</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">CDataJavaConfig</span><span class="w"> </span><span class="kd">implements</span><span class="w"> </span><span class="n">InfoMapper</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nd">@Override</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">map</span><span class="p">(</span><span class="n">InfoMap</span><span class="w"> </span><span class="n">infoMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span><span class="c1"># Compile our Java code</span>
$<span class="w"> </span>javac<span class="w"> </span>-cp<span class="w"> </span>javacpp-1.5.7.jar<span class="w"> </span>CDataJavaConfig.java
<span class="c1"># Generate CDataInterfaceLibrary</span>
$<span class="w"> </span>java<span class="w"> </span>-jar<span class="w"> </span>javacpp-1.5.7.jar<span class="w"> </span>CDataJavaConfig.java
<span class="c1"># Generate libjniCDataInterfaceLibrary.dylib</span>
$<span class="w"> </span>java<span class="w"> </span>-jar<span class="w"> </span>javacpp-1.5.7.jar<span class="w"> </span>CDataJavaToCppExample.java
<span class="c1"># Validate libjniCDataInterfaceLibrary.dylib created</span>
$<span class="w"> </span>otool<span class="w"> </span>-L<span class="w"> </span>macosx-x86_64/libjniCDataJavaToCppExample.dylib
macosx-x86_64/libjniCDataJavaToCppExample.dylib:
<span class="w"> </span>libjniCDataJavaToCppExample.dylib<span class="w"> </span><span class="o">(</span>compatibility<span class="w"> </span>version<span class="w"> </span><span class="m">0</span>.0.0,<span class="w"> </span>current<span class="w"> </span>version<span class="w"> </span><span class="m">0</span>.0.0<span class="o">)</span>
<span class="w"> </span>@rpath/libarrow.800.dylib<span class="w"> </span><span class="o">(</span>compatibility<span class="w"> </span>version<span class="w"> </span><span class="m">800</span>.0.0,<span class="w"> </span>current<span class="w"> </span>version<span class="w"> </span><span class="m">800</span>.0.0<span class="o">)</span>
<span class="w"> </span>/usr/lib/libc++.1.dylib<span class="w"> </span><span class="o">(</span>compatibility<span class="w"> </span>version<span class="w"> </span><span class="m">1</span>.0.0,<span class="w"> </span>current<span class="w"> </span>version<span class="w"> </span><span class="m">1200</span>.3.0<span class="o">)</span>
<span class="w"> </span>/usr/lib/libSystem.B.dylib<span class="w"> </span><span class="o">(</span>compatibility<span class="w"> </span>version<span class="w"> </span><span class="m">1</span>.0.0,<span class="w"> </span>current<span class="w"> </span>version<span class="w"> </span><span class="m">1311</span>.0.0<span class="o">)</span>
</pre></div>
</div>
<p><strong>Java Test</strong></p>
<p>Let’s create a Java class to test our bridge:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.c.ArrowArray</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.c.ArrowSchema</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.c.Data</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.memory.BufferAllocator</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.memory.RootAllocator</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.vector.BigIntVector</span><span class="p">;</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">TestCDataInterface</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">try</span><span class="p">(</span>
<span class="w"> </span><span class="n">BufferAllocator</span><span class="w"> </span><span class="n">allocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">RootAllocator</span><span class="p">();</span>
<span class="w"> </span><span class="n">ArrowSchema</span><span class="w"> </span><span class="n">arrowSchema</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ArrowSchema</span><span class="p">.</span><span class="na">allocateNew</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span>
<span class="w"> </span><span class="n">ArrowArray</span><span class="w"> </span><span class="n">arrowArray</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ArrowArray</span><span class="p">.</span><span class="na">allocateNew</span><span class="p">(</span><span class="n">allocator</span><span class="p">)</span>
<span class="w"> </span><span class="p">){</span>
<span class="w"> </span><span class="n">CDataJavaToCppExample</span><span class="p">.</span><span class="na">FillInt64Array</span><span class="p">(</span>
<span class="w"> </span><span class="n">arrowSchema</span><span class="p">.</span><span class="na">memoryAddress</span><span class="p">(),</span><span class="w"> </span><span class="n">arrowArray</span><span class="p">.</span><span class="na">memoryAddress</span><span class="p">());</span>
<span class="w"> </span><span class="k">try</span><span class="p">(</span>
<span class="w"> </span><span class="n">BigIntVector</span><span class="w"> </span><span class="n">bigIntVector</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">BigIntVector</span><span class="p">)</span><span class="w"> </span><span class="n">Data</span><span class="p">.</span><span class="na">importVector</span><span class="p">(</span>
<span class="w"> </span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="n">arrowArray</span><span class="p">,</span><span class="w"> </span><span class="n">arrowSchema</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span>
<span class="w"> </span><span class="p">){</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;C++-allocated array: &quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">bigIntVector</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>C++-allocated<span class="w"> </span>array:<span class="w"> </span><span class="o">[</span><span class="m">1</span>,<span class="w"> </span><span class="m">2</span>,<span class="w"> </span><span class="m">3</span>,<span class="w"> </span>null,<span class="w"> </span><span class="m">5</span>,<span class="w"> </span><span class="m">6</span>,<span class="w"> </span><span class="m">7</span>,<span class="w"> </span><span class="m">8</span>,<span class="w"> </span><span class="m">9</span>,<span class="w"> </span><span class="m">10</span><span class="o">]</span>
</pre></div>
</div>
</section>
<section id="share-an-int32-array-from-java-to-c">
<h3><a class="toc-backref" href="#id5" role="doc-backlink">Share an Int32 array from Java to C++</a><a class="headerlink" href="#share-an-int32-array-from-java-to-c" title="Permalink to this heading">#</a></h3>
<p><strong>Java Side</strong></p>
<p>For this example, we will build a JAR with all dependencies bundled.</p>
<div class="highlight-xml notranslate"><div class="highlight"><pre><span></span><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
<span class="nt">&lt;project</span><span class="w"> </span><span class="na">xmlns=</span><span class="s">&quot;http://maven.apache.org/POM/4.0.0&quot;</span>
<span class="w"> </span><span class="na">xmlns:xsi=</span><span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span>
<span class="w"> </span><span class="na">xsi:schemaLocation=</span><span class="s">&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;</span><span class="nt">&gt;</span>
<span class="w"> </span><span class="nt">&lt;modelVersion&gt;</span>4.0.0<span class="nt">&lt;/modelVersion&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.example<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>cpptojava<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>1.0-SNAPSHOT<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;properties&gt;</span>
<span class="w"> </span><span class="nt">&lt;maven.compiler.source&gt;</span>8<span class="nt">&lt;/maven.compiler.source&gt;</span>
<span class="w"> </span><span class="nt">&lt;maven.compiler.target&gt;</span>8<span class="nt">&lt;/maven.compiler.target&gt;</span>
<span class="w"> </span><span class="nt">&lt;arrow.version&gt;</span>9.0.0<span class="nt">&lt;/arrow.version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/properties&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependencies&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.apache.arrow<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>arrow-c-data<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>${arrow.version}<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.apache.arrow<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>arrow-memory-netty<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;version&gt;</span>${arrow.version}<span class="nt">&lt;/version&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependency&gt;</span>
<span class="w"> </span><span class="nt">&lt;/dependencies&gt;</span>
<span class="w"> </span><span class="nt">&lt;build&gt;</span>
<span class="w"> </span><span class="nt">&lt;plugins&gt;</span>
<span class="w"> </span><span class="nt">&lt;plugin&gt;</span>
<span class="w"> </span><span class="nt">&lt;groupId&gt;</span>org.apache.maven.plugins<span class="nt">&lt;/groupId&gt;</span>
<span class="w"> </span><span class="nt">&lt;artifactId&gt;</span>maven-assembly-plugin<span class="nt">&lt;/artifactId&gt;</span>
<span class="w"> </span><span class="nt">&lt;executions&gt;</span>
<span class="w"> </span><span class="nt">&lt;execution&gt;</span>
<span class="w"> </span><span class="nt">&lt;phase&gt;</span>package<span class="nt">&lt;/phase&gt;</span>
<span class="w"> </span><span class="nt">&lt;goals&gt;</span>
<span class="w"> </span><span class="nt">&lt;goal&gt;</span>single<span class="nt">&lt;/goal&gt;</span>
<span class="w"> </span><span class="nt">&lt;/goals&gt;</span>
<span class="w"> </span><span class="nt">&lt;configuration&gt;</span>
<span class="w"> </span><span class="nt">&lt;descriptorRefs&gt;</span>
<span class="w"> </span><span class="nt">&lt;descriptorRef&gt;</span>jar-with-dependencies<span class="nt">&lt;/descriptorRef&gt;</span>
<span class="w"> </span><span class="nt">&lt;/descriptorRefs&gt;</span>
<span class="w"> </span><span class="nt">&lt;/configuration&gt;</span>
<span class="w"> </span><span class="nt">&lt;/execution&gt;</span>
<span class="w"> </span><span class="nt">&lt;/executions&gt;</span>
<span class="w"> </span><span class="nt">&lt;/plugin&gt;</span>
<span class="w"> </span><span class="nt">&lt;/plugins&gt;</span>
<span class="w"> </span><span class="nt">&lt;/build&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</pre></div>
</div>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.c.ArrowArray</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.c.ArrowSchema</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.c.Data</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.memory.BufferAllocator</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.memory.RootAllocator</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.vector.FieldVector</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.vector.IntVector</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.arrow.vector.VectorSchemaRoot</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.util.Arrays</span><span class="p">;</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ToBeCalledByCpp</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">BufferAllocator</span><span class="w"> </span><span class="n">allocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">RootAllocator</span><span class="p">();</span>
<span class="w"> </span><span class="cm">/**</span>
<span class="cm"> * Create a {@link FieldVector} and export it via the C Data Interface</span>
<span class="cm"> * @param schemaAddress Schema memory address to wrap</span>
<span class="cm"> * @param arrayAddress Array memory address to wrap</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">fillVector</span><span class="p">(</span><span class="kt">long</span><span class="w"> </span><span class="n">schemaAddress</span><span class="p">,</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">arrayAddress</span><span class="p">){</span>
<span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="p">(</span><span class="n">ArrowArray</span><span class="w"> </span><span class="n">arrow_array</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ArrowArray</span><span class="p">.</span><span class="na">wrap</span><span class="p">(</span><span class="n">arrayAddress</span><span class="p">);</span>
<span class="w"> </span><span class="n">ArrowSchema</span><span class="w"> </span><span class="n">arrow_schema</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ArrowSchema</span><span class="p">.</span><span class="na">wrap</span><span class="p">(</span><span class="n">schemaAddress</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Data</span><span class="p">.</span><span class="na">exportVector</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="n">populateFieldVectorToExport</span><span class="p">(),</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="n">arrow_array</span><span class="p">,</span><span class="w"> </span><span class="n">arrow_schema</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="cm">/**</span>
<span class="cm"> * Create a {@link VectorSchemaRoot} and export it via the C Data Interface</span>
<span class="cm"> * @param schemaAddress Schema memory address to wrap</span>
<span class="cm"> * @param arrayAddress Array memory address to wrap</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">fillVectorSchemaRoot</span><span class="p">(</span><span class="kt">long</span><span class="w"> </span><span class="n">schemaAddress</span><span class="p">,</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">arrayAddress</span><span class="p">){</span>
<span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="p">(</span><span class="n">ArrowArray</span><span class="w"> </span><span class="n">arrow_array</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ArrowArray</span><span class="p">.</span><span class="na">wrap</span><span class="p">(</span><span class="n">arrayAddress</span><span class="p">);</span>
<span class="w"> </span><span class="n">ArrowSchema</span><span class="w"> </span><span class="n">arrow_schema</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ArrowSchema</span><span class="p">.</span><span class="na">wrap</span><span class="p">(</span><span class="n">schemaAddress</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Data</span><span class="p">.</span><span class="na">exportVectorSchemaRoot</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="n">populateVectorSchemaRootToExport</span><span class="p">(),</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="n">arrow_array</span><span class="p">,</span><span class="w"> </span><span class="n">arrow_schema</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">FieldVector</span><span class="w"> </span><span class="nf">populateFieldVectorToExport</span><span class="p">(){</span>
<span class="w"> </span><span class="n">IntVector</span><span class="w"> </span><span class="n">intVector</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">IntVector</span><span class="p">(</span><span class="s">&quot;int-to-export&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">allocator</span><span class="p">);</span>
<span class="w"> </span><span class="n">intVector</span><span class="p">.</span><span class="na">allocateNew</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="w"> </span><span class="n">intVector</span><span class="p">.</span><span class="na">setSafe</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="w"> </span><span class="n">intVector</span><span class="p">.</span><span class="na">setSafe</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span>
<span class="w"> </span><span class="n">intVector</span><span class="p">.</span><span class="na">setSafe</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">);</span>
<span class="w"> </span><span class="n">intVector</span><span class="p">.</span><span class="na">setValueCount</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;[Java] FieldVector: \n&quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">intVector</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">intVector</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">VectorSchemaRoot</span><span class="w"> </span><span class="nf">populateVectorSchemaRootToExport</span><span class="p">(){</span>
<span class="w"> </span><span class="n">IntVector</span><span class="w"> </span><span class="n">intVector</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">IntVector</span><span class="p">(</span><span class="s">&quot;age-to-export&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">allocator</span><span class="p">);</span>
<span class="w"> </span><span class="n">intVector</span><span class="p">.</span><span class="na">setSafe</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">);</span>
<span class="w"> </span><span class="n">intVector</span><span class="p">.</span><span class="na">setSafe</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">20</span><span class="p">);</span>
<span class="w"> </span><span class="n">intVector</span><span class="p">.</span><span class="na">setSafe</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">);</span>
<span class="w"> </span><span class="n">VectorSchemaRoot</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">VectorSchemaRoot</span><span class="p">(</span><span class="n">Arrays</span><span class="p">.</span><span class="na">asList</span><span class="p">(</span><span class="n">intVector</span><span class="p">));</span>
<span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="na">setRowCount</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;[Java] VectorSchemaRoot: \n&quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="na">contentToTSVString</span><span class="p">());</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">root</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Build the JAR and copy it to the C++ project.</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>mvn<span class="w"> </span>clean<span class="w"> </span>install
$<span class="w"> </span>cp<span class="w"> </span>target/cpptojava-1.0-SNAPSHOT-jar-with-dependencies.jar<span class="w"> </span>&lt;c++<span class="w"> </span>project<span class="w"> </span>path&gt;/cpptojava.jar
</pre></div>
</div>
<p><strong>C++ Side</strong></p>
<p>This application uses JNI to call Java code, but transfers data (zero-copy) via the C Data Interface instead.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;iostream&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;jni.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/api.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/c/bridge.h&gt;</span>
<span class="n">JNIEnv</span><span class="w"> </span><span class="o">*</span><span class="nf">CreateVM</span><span class="p">(</span><span class="n">JavaVM</span><span class="w"> </span><span class="o">**</span><span class="n">jvm</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">JNIEnv</span><span class="w"> </span><span class="o">*</span><span class="n">env</span><span class="p">;</span>
<span class="w"> </span><span class="n">JavaVMInitArgs</span><span class="w"> </span><span class="n">vm_args</span><span class="p">;</span>
<span class="w"> </span><span class="n">JavaVMOption</span><span class="w"> </span><span class="n">options</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
<span class="w"> </span><span class="n">options</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">optionString</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;-Djava.class.path=cpptojava.jar&quot;</span><span class="p">;</span>
<span class="w"> </span><span class="n">options</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">optionString</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;-DXcheck:jni:pedantic&quot;</span><span class="p">;</span>
<span class="w"> </span><span class="n">vm_args</span><span class="p">.</span><span class="n">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JNI_VERSION_1_8</span><span class="p">;</span>
<span class="w"> </span><span class="n">vm_args</span><span class="p">.</span><span class="n">nOptions</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span>
<span class="w"> </span><span class="n">vm_args</span><span class="p">.</span><span class="n">options</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">options</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JNI_CreateJavaVM</span><span class="p">(</span><span class="n">jvm</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">**</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="n">env</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">vm_args</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">status</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cerr</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&lt;&lt;&lt;&lt;&lt; Unable to Launch JVM &gt;&gt;&gt;&gt;&gt;</span><span class="se">\n</span><span class="s">&quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">nullptr</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">env</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">JNIEnv</span><span class="w"> </span><span class="o">*</span><span class="n">env</span><span class="p">;</span>
<span class="w"> </span><span class="n">JavaVM</span><span class="w"> </span><span class="o">*</span><span class="n">jvm</span><span class="p">;</span>
<span class="w"> </span><span class="n">env</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">CreateVM</span><span class="p">(</span><span class="o">&amp;</span><span class="n">jvm</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">env</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">nullptr</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">EXIT_FAILURE</span><span class="p">;</span>
<span class="w"> </span><span class="n">jclass</span><span class="w"> </span><span class="n">javaClassToBeCalledByCpp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">env</span><span class="o">-&gt;</span><span class="n">FindClass</span><span class="p">(</span><span class="s">&quot;ToBeCalledByCpp&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">javaClassToBeCalledByCpp</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">nullptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">jmethodID</span><span class="w"> </span><span class="n">fillVector</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">env</span><span class="o">-&gt;</span><span class="n">GetStaticMethodID</span><span class="p">(</span><span class="n">javaClassToBeCalledByCpp</span><span class="p">,</span>
<span class="w"> </span><span class="s">&quot;fillVector&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="s">&quot;(JJ)V&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">fillVector</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">nullptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ArrowSchema</span><span class="w"> </span><span class="n">arrowSchema</span><span class="p">;</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ArrowArray</span><span class="w"> </span><span class="n">arrowArray</span><span class="p">;</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&lt;&lt;&lt;&lt;&lt; C++ to Java for Arrays &gt;&gt;&gt;&gt;&gt;</span><span class="se">\n</span><span class="s">&quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="n">env</span><span class="o">-&gt;</span><span class="n">CallStaticVoidMethod</span><span class="p">(</span><span class="n">javaClassToBeCalledByCpp</span><span class="p">,</span><span class="w"> </span><span class="n">fillVector</span><span class="p">,</span>
<span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">jlong</span><span class="o">&gt;</span><span class="p">(</span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">uintptr_t</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">arrowSchema</span><span class="p">)),</span>
<span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">jlong</span><span class="o">&gt;</span><span class="p">(</span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">uintptr_t</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">arrowArray</span><span class="p">)));</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">resultImportArray</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ImportArray</span><span class="p">(</span><span class="o">&amp;</span><span class="n">arrowArray</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">arrowSchema</span><span class="p">);</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Array</span><span class="o">&gt;</span><span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">resultImportArray</span><span class="p">.</span><span class="n">ValueOrDie</span><span class="p">();</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;[C++] Array: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">array</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cerr</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Could not find fillVector method</span><span class="se">\n</span><span class="s">&quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">EXIT_FAILURE</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">jmethodID</span><span class="w"> </span><span class="n">fillVectorSchemaRoot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">env</span><span class="o">-&gt;</span><span class="n">GetStaticMethodID</span><span class="p">(</span><span class="n">javaClassToBeCalledByCpp</span><span class="p">,</span>
<span class="w"> </span><span class="s">&quot;fillVectorSchemaRoot&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="s">&quot;(JJ)V&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">fillVectorSchemaRoot</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">nullptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ArrowSchema</span><span class="w"> </span><span class="n">arrowSchema</span><span class="p">;</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ArrowArray</span><span class="w"> </span><span class="n">arrowArray</span><span class="p">;</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&lt;&lt;&lt;&lt;&lt; C++ to Java for RecordBatch &gt;&gt;&gt;&gt;&gt;</span><span class="se">\n</span><span class="s">&quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="n">env</span><span class="o">-&gt;</span><span class="n">CallStaticVoidMethod</span><span class="p">(</span><span class="n">javaClassToBeCalledByCpp</span><span class="p">,</span><span class="w"> </span><span class="n">fillVectorSchemaRoot</span><span class="p">,</span>
<span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">jlong</span><span class="o">&gt;</span><span class="p">(</span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">uintptr_t</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">arrowSchema</span><span class="p">)),</span>
<span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">jlong</span><span class="o">&gt;</span><span class="p">(</span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">uintptr_t</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">arrowArray</span><span class="p">)));</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">resultImportVectorSchemaRoot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ImportRecordBatch</span><span class="p">(</span><span class="o">&amp;</span><span class="n">arrowArray</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">arrowSchema</span><span class="p">);</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">RecordBatch</span><span class="o">&gt;</span><span class="w"> </span><span class="n">recordBatch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">resultImportVectorSchemaRoot</span><span class="p">.</span><span class="n">ValueOrDie</span><span class="p">();</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;[C++] RecordBatch: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">recordBatch</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cerr</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Could not find fillVectorSchemaRoot method</span><span class="se">\n</span><span class="s">&quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">EXIT_FAILURE</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Could not find ToBeCalledByCpp class</span><span class="se">\n</span><span class="s">&quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">EXIT_FAILURE</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">jvm</span><span class="o">-&gt;</span><span class="n">DestroyJavaVM</span><span class="p">();</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">EXIT_SUCCESS</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>CMakeLists.txt definition file:</p>
<div class="highlight-cmake notranslate"><div class="highlight"><pre><span></span><span class="nb">cmake_minimum_required</span><span class="p">(</span><span class="s">VERSION</span><span class="w"> </span><span class="s">3.19</span><span class="p">)</span>
<span class="nb">project</span><span class="p">(</span><span class="s">cdatacpptojava</span><span class="p">)</span>
<span class="nb">find_package</span><span class="p">(</span><span class="s">JNI</span><span class="w"> </span><span class="s">REQUIRED</span><span class="p">)</span>
<span class="nb">find_package</span><span class="p">(</span><span class="s">Arrow</span><span class="w"> </span><span class="s">REQUIRED</span><span class="p">)</span>
<span class="nb">message</span><span class="p">(</span><span class="s">STATUS</span><span class="w"> </span><span class="s2">&quot;Arrow version: ${ARROW_VERSION}&quot;</span><span class="p">)</span>
<span class="nb">include_directories</span><span class="p">(</span><span class="o">${</span><span class="nv">JNI_INCLUDE_DIRS</span><span class="o">}</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_CXX_STANDARD</span><span class="w"> </span><span class="s">17</span><span class="p">)</span>
<span class="nb">add_executable</span><span class="p">(</span><span class="o">${</span><span class="nv">PROJECT_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">main.cpp</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="s">cdatacpptojava</span><span class="w"> </span><span class="s">PRIVATE</span><span class="w"> </span><span class="s">Arrow::arrow_shared</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="s">cdatacpptojava</span><span class="w"> </span><span class="s">PRIVATE</span><span class="w"> </span><span class="o">${</span><span class="nv">JNI_LIBRARIES</span><span class="o">}</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>Result</strong></p>
<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>&lt;&lt;&lt;&lt;&lt; C++ to Java for Arrays &gt;&gt;&gt;&gt;&gt;
[Java] FieldVector:
[1, 2, 3]
[C++] Array: [
1,
2,
3
]
&lt;&lt;&lt;&lt;&lt; C++ to Java for RecordBatch &gt;&gt;&gt;&gt;&gt;
[Java] VectorSchemaRoot:
age-to-export
10
20
30
[C++] RecordBatch: age-to-export: [
10,
20,
30
]
</pre></div>
</div>
</section>
</section>
</section>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
<a class="left-prev"
href="substrait.html"
title="previous page">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">previous</p>
<p class="prev-next-title">Substrait</p>
</div>
</a>
<a class="right-next"
href="jdbc.html"
title="next page">
<div class="prev-next-info">
<p class="prev-next-subtitle">next</p>
<p class="prev-next-title">Arrow JDBC Adapter</p>
</div>
<i class="fa-solid fa-angle-right"></i>
</a>
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
<div class="sidebar-secondary-item">
<div
id="pst-page-navigation-heading-2"
class="page-toc tocsection onthispage">
<i class="fa-solid fa-list"></i> On this page
</div>
<nav class="bd-toc-nav page-toc" aria-labelledby="pst-page-navigation-heading-2">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#java-to-python">Java to Python</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#java-to-c">Java to C++</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#share-an-int64-array-from-c-to-java">Share an Int64 array from C++ to Java</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#share-an-int32-array-from-java-to-c">Share an Int32 array from Java to C++</a></li>
</ul>
</li>
</ul>
</nav></div>
<div class="sidebar-secondary-item">
<div class="tocsection editthispage">
<a href="https://github.com/apache/arrow/edit/main/docs/source/java/cdata.rst">
<i class="fa-solid fa-pencil"></i>
Edit on GitHub
</a>
</div>
</div>
</div></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2016-2024 Apache Software Foundation.
Apache Arrow, Arrow, Apache, the Apache feather logo, and the Apache Arrow project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 6.2.0.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>