You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ko...@apache.org on 2022/07/25 20:45:53 UTC

[arrow] branch master updated: ARROW-17080: [Java] Add a top-level CMakeLists.txt for JNI (#13618)

This is an automated email from the ASF dual-hosted git repository.

kou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new ab8c92cf07 ARROW-17080: [Java] Add a top-level CMakeLists.txt for JNI (#13618)
ab8c92cf07 is described below

commit ab8c92cf0761fa0399860a7110038f9db8a76231
Author: Sutou Kouhei <ko...@clear-code.com>
AuthorDate: Tue Jul 26 05:45:46 2022 +0900

    ARROW-17080: [Java] Add a top-level CMakeLists.txt for JNI (#13618)
    
    Authored-by: Sutou Kouhei <ko...@clear-code.com>
    Signed-off-by: Sutou Kouhei <ko...@clear-code.com>
---
 ci/scripts/java_build.sh                           |  4 +-
 .../{java_cdata_build.sh => java_jni_build.sh}     | 13 ++---
 ci/scripts/java_jni_macos_build.sh                 | 33 +++++++-----
 ci/scripts/java_jni_manylinux_build.sh             | 39 +++++++++-----
 ci/scripts/java_test.sh                            |  4 +-
 dev/tasks/java-jars/github.yml                     | 14 ++---
 docker-compose.yml                                 | 16 +++---
 docs/source/developers/java/building.rst           |  5 +-
 java/.gitignore                                    | 32 ++++++------
 java/CMakeLists.txt                                | 59 ++++++++++++++++++++++
 java/c/.gitignore                                  |  1 -
 java/c/CMakeLists.txt                              | 31 +++---------
 12 files changed, 151 insertions(+), 100 deletions(-)

diff --git a/ci/scripts/java_build.sh b/ci/scripts/java_build.sh
index adfc021f04..b0362868b0 100755
--- a/ci/scripts/java_build.sh
+++ b/ci/scripts/java_build.sh
@@ -22,7 +22,7 @@ arrow_dir=${1}
 source_dir=${1}/java
 build_dir=${2}
 cpp_build_dir=${build_dir}/cpp/${ARROW_BUILD_TYPE:-debug}
-cdata_dist_dir=${build_dir}/java/c
+java_jni_dist_dir=${3}
 
 : ${BUILD_DOCS_JAVA:=OFF}
 
@@ -76,7 +76,7 @@ if [ "${ARROW_JAVA_SHADE_FLATBUFFERS}" == "ON" ]; then
 fi
 
 if [ "${ARROW_JAVA_CDATA}" = "ON" ]; then
-  ${mvn} -Darrow.c.jni.dist.dir=${cdata_dist_dir} -Parrow-c-data install
+  ${mvn} -Darrow.c.jni.dist.dir=${java_jni_dist_dir} -Parrow-c-data install
 fi
 
 if [ "${ARROW_GANDIVA_JAVA}" = "ON" ]; then
diff --git a/ci/scripts/java_cdata_build.sh b/ci/scripts/java_jni_build.sh
similarity index 83%
rename from ci/scripts/java_cdata_build.sh
rename to ci/scripts/java_jni_build.sh
index 730c775d40..0f19e61413 100755
--- a/ci/scripts/java_cdata_build.sh
+++ b/ci/scripts/java_jni_build.sh
@@ -20,7 +20,7 @@
 set -ex
 
 arrow_dir=${1}
-build_dir=${2}
+build_dir=${2}/java_jni
 # The directory where the final binaries will be stored when scripts finish
 dist_dir=${3}
 
@@ -34,12 +34,9 @@ pushd "${build_dir}"
 
 cmake \
   -DCMAKE_BUILD_TYPE=${ARROW_BUILD_TYPE:-release} \
-  -DCMAKE_INSTALL_LIBDIR=lib \
-  -DCMAKE_INSTALL_PREFIX=${build_dir} \
-  ${arrow_dir}/java/c
+  -DCMAKE_INSTALL_PREFIX=${dist_dir} \
+  -DCMAKE_UNITY_BUILD=${CMAKE_UNITY_BUILD:-OFF} \
+  ${JAVA_JNI_CMAKE_ARGS:-} \
+  ${arrow_dir}/java
 cmake --build . --target install --config ${ARROW_BUILD_TYPE:-release}
 popd
-
-echo "=== Copying libraries to the distribution folder ==="
-mkdir -p "${dist_dir}"
-cp -L ${build_dir}/lib/*arrow_cdata_jni.* ${dist_dir}
diff --git a/ci/scripts/java_jni_macos_build.sh b/ci/scripts/java_jni_macos_build.sh
index e9572c334b..3030f89834 100755
--- a/ci/scripts/java_jni_macos_build.sh
+++ b/ci/scripts/java_jni_macos_build.sh
@@ -46,11 +46,10 @@ export ARROW_TEST_DATA="${arrow_dir}/testing/data"
 export PARQUET_TEST_DATA="${arrow_dir}/cpp/submodules/parquet-testing/data"
 export AWS_EC2_METADATA_DISABLED=TRUE
 
-mkdir -p "${build_dir}"
-pushd "${build_dir}"
+mkdir -p "${build_dir}/cpp"
+pushd "${build_dir}/cpp"
 
 cmake \
-  -GNinja \
   -DARROW_BOOST_USE_SHARED=OFF \
   -DARROW_BROTLI_USE_SHARED=OFF \
   -DARROW_BUILD_TESTS=${ARROW_BUILD_TESTS} \
@@ -58,9 +57,9 @@ cmake \
   -DARROW_BZ2_USE_SHARED=OFF \
   -DARROW_DATASET=${ARROW_DATASET} \
   -DARROW_FILESYSTEM=${ARROW_FILESYSTEM} \
+  -DARROW_GANDIVA=${ARROW_GANDIVA} \
   -DARROW_GANDIVA_JAVA=${ARROW_GANDIVA_JAVA} \
   -DARROW_GANDIVA_STATIC_LIBSTDCPP=ON \
-  -DARROW_GANDIVA=${ARROW_GANDIVA} \
   -DARROW_GFLAGS_USE_SHARED=OFF \
   -DARROW_GRPC_USE_SHARED=OFF \
   -DARROW_JNI=ON \
@@ -68,8 +67,8 @@ cmake \
   -DARROW_OPENSSL_USE_SHARED=OFF \
   -DARROW_ORC=${ARROW_ORC} \
   -DARROW_PARQUET=${ARROW_PARQUET} \
-  -DARROW_PLASMA_JAVA_CLIENT=${ARROW_PLASMA_JAVA_CLIENT} \
   -DARROW_PLASMA=${ARROW_PLASMA} \
+  -DARROW_PLASMA_JAVA_CLIENT=${ARROW_PLASMA_JAVA_CLIENT} \
   -DARROW_PROTOBUF_USE_SHARED=OFF \
   -DARROW_PYTHON=${ARROW_PYTHON} \
   -DARROW_SNAPPY_USE_SHARED=OFF \
@@ -78,12 +77,13 @@ cmake \
   -DARROW_ZSTD_USE_SHARED=OFF \
   -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \
   -DCMAKE_INSTALL_LIBDIR=lib \
-  -DCMAKE_INSTALL_PREFIX=${build_dir} \
+  -DCMAKE_INSTALL_PREFIX=${build_dir}/cpp \
   -DCMAKE_UNITY_BUILD=${CMAKE_UNITY_BUILD} \
   -DPARQUET_BUILD_EXAMPLES=OFF \
   -DPARQUET_BUILD_EXECUTABLES=OFF \
   -DPARQUET_REQUIRE_ENCRYPTION=OFF \
   -Dre2_SOURCE=BUNDLED \
+  -GNinja \
   ${arrow_dir}/cpp
 cmake --build . --target install
 
@@ -93,24 +93,33 @@ fi
 
 popd
 
+
+${arrow_dir}/ci/scripts/java_jni_build.sh \
+  ${arrow_dir} \
+  ${build_dir} \
+  ${dist_dir}
+
+
 echo "=== Copying libraries to the distribution folder ==="
 mkdir -p "${dist_dir}"
-cp -L ${build_dir}/lib/libgandiva_jni.dylib ${dist_dir}
-cp -L ${build_dir}/lib/libarrow_dataset_jni.dylib ${dist_dir}
-cp -L ${build_dir}/lib/libarrow_orc_jni.dylib ${dist_dir}
+cp -L ${build_dir}/cpp/lib/libgandiva_jni.dylib ${dist_dir}
+cp -L ${build_dir}/cpp/lib/libarrow_dataset_jni.dylib ${dist_dir}
+cp -L ${build_dir}/cpp/lib/libarrow_orc_jni.dylib ${dist_dir}
 
 echo "=== Checking shared dependencies for libraries ==="
 
 pushd ${dist_dir}
 archery linking check-dependencies \
+  --allow libSystem \
+  --allow libarrow_cdata_jni \
   --allow libarrow_dataset_jni \
   --allow libarrow_orc_jni \
   --allow libc++ \
   --allow libgandiva_jni \
   --allow libncurses \
-  --allow libSystem \
   --allow libz \
-  libgandiva_jni.dylib \
+  libarrow_cdata_jni.dylib \
   libarrow_dataset_jni.dylib \
-  libarrow_orc_jni.dylib
+  libarrow_orc_jni.dylib \
+  libgandiva_jni.dylib
 popd
diff --git a/ci/scripts/java_jni_manylinux_build.sh b/ci/scripts/java_jni_manylinux_build.sh
index 105d314a66..81949bd5be 100755
--- a/ci/scripts/java_jni_manylinux_build.sh
+++ b/ci/scripts/java_jni_manylinux_build.sh
@@ -55,8 +55,8 @@ export ARROW_TEST_DATA="${arrow_dir}/testing/data"
 export PARQUET_TEST_DATA="${arrow_dir}/cpp/submodules/parquet-testing/data"
 export AWS_EC2_METADATA_DISABLED=TRUE
 
-mkdir -p "${build_dir}"
-pushd "${build_dir}"
+mkdir -p "${build_dir}/cpp"
+pushd "${build_dir}/cpp"
 
 cmake \
   -DARROW_BOOST_USE_SHARED=OFF \
@@ -89,7 +89,7 @@ cmake \
   -DARROW_ZSTD_USE_SHARED=OFF \
   -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \
   -DCMAKE_INSTALL_LIBDIR=lib \
-  -DCMAKE_INSTALL_PREFIX=${build_dir} \
+  -DCMAKE_INSTALL_PREFIX=${build_dir}/cpp \
   -DCMAKE_UNITY_BUILD=${CMAKE_UNITY_BUILD} \
   -DORC_SOURCE=BUNDLED \
   -DORC_PROTOBUF_EXECUTABLE=${VCPKG_ROOT}/installed/${VCPKG_TARGET_TRIPLET}/tools/protobuf/protoc \
@@ -105,20 +105,30 @@ cmake \
 ninja install
 
 if [ $ARROW_BUILD_TESTS = "ON" ]; then
-    ctest \
-        --label-regex unittest \
-        --output-on-failure \
-        --parallel $(nproc) \
-        --timeout 300
+  ctest \
+    --label-regex unittest \
+    --output-on-failure \
+    --parallel $(nproc) \
+    --timeout 300
 fi
 
 popd
 
+
+JAVA_JNI_CMAKE_ARGS=""
+JAVA_JNI_CMAKE_ARGS="${JAVA_JNI_CMAKE_ARGS} -DVCPKG_MANIFEST_MODE=OFF"
+JAVA_JNI_CMAKE_ARGS="${JAVA_JNI_CMAKE_ARGS} -DVCPKG_TARGET_TRIPLET=${VCPKG_TARGET_TRIPLET}"
+export JAVA_JNI_CMAKE_ARGS
+${arrow_dir}/ci/scripts/java_jni_build.sh \
+  ${arrow_dir} \
+  ${build_dir} \
+  ${dist_dir}
+
+
 echo "=== Copying libraries to the distribution folder ==="
-mkdir -p "${dist_dir}"
-cp -L ${build_dir}/lib/libgandiva_jni.so ${dist_dir}
-cp -L ${build_dir}/lib/libarrow_dataset_jni.so ${dist_dir}
-cp -L ${build_dir}/lib/libarrow_orc_jni.so ${dist_dir}
+cp -L ${build_dir}/cpp/lib/libgandiva_jni.so ${dist_dir}
+cp -L ${build_dir}/cpp/lib/libarrow_dataset_jni.so ${dist_dir}
+cp -L ${build_dir}/cpp/lib/libarrow_orc_jni.so ${dist_dir}
 
 echo "=== Checking shared dependencies for libraries ==="
 
@@ -134,7 +144,8 @@ archery linking check-dependencies \
   --allow libstdc++ \
   --allow libz \
   --allow linux-vdso \
-  libgandiva_jni.so \
+  libarrow_cdata_jni.so \
   libarrow_dataset_jni.so \
-  libarrow_orc_jni.so
+  libarrow_orc_jni.so \
+  libgandiva_jni.so
 popd
diff --git a/ci/scripts/java_test.sh b/ci/scripts/java_test.sh
index 0e755bcafb..83ef26fdb1 100755
--- a/ci/scripts/java_test.sh
+++ b/ci/scripts/java_test.sh
@@ -21,7 +21,7 @@ set -ex
 arrow_dir=${1}
 source_dir=${1}/java
 cpp_build_dir=${2}/cpp/${ARROW_BUILD_TYPE:-debug}
-cdata_dist_dir=${2}/java/c
+java_jni_dist_dir=${3}
 
 # For JNI and Plasma tests
 export LD_LIBRARY_PATH=${ARROW_HOME}/lib:${LD_LIBRARY_PATH}
@@ -40,7 +40,7 @@ if [ "${ARROW_JNI}" = "ON" ]; then
 fi
 
 if [ "${ARROW_JAVA_CDATA}" = "ON" ]; then
-  ${mvn} test -Parrow-c-data -pl c -Darrow.c.jni.dist.dir=${cdata_dist_dir}
+  ${mvn} test -Parrow-c-data -pl c -Darrow.c.jni.dist.dir=${java_jni_dist_dir}
 fi
 
 if [ "${ARROW_PLASMA}" = "ON" ]; then
diff --git a/dev/tasks/java-jars/github.yml b/dev/tasks/java-jars/github.yml
index ba3179535b..9f13034490 100644
--- a/dev/tasks/java-jars/github.yml
+++ b/dev/tasks/java-jars/github.yml
@@ -29,7 +29,7 @@ jobs:
       {{ macros.github_install_archery()|indent }}
       - name: Build C++ Libs
         run: archery docker run java-jni-manylinux-2014
-      - name: Compress into single artifact
+      - name: Compress into single artifact to keep directory structure
         run: tar -cvzf arrow-shared-libs-linux.tar.gz arrow/java-dist/
       - name: Upload Artifacts
         uses: actions/upload-artifact@v2
@@ -55,13 +55,6 @@ jobs:
         run: |
           brew install --overwrite git
           brew bundle --file=arrow/cpp/Brewfile
-      - name: Build C Data Interface lib
-        run: |
-          set -e
-          arrow/ci/scripts/java_cdata_build.sh \
-            $GITHUB_WORKSPACE/arrow \
-            $GITHUB_WORKSPACE/arrow/java-native-build \
-            $GITHUB_WORKSPACE/arrow/java-dist
       - name: Build C++ Libs
         run: |
           set -e
@@ -69,7 +62,7 @@ jobs:
             $GITHUB_WORKSPACE/arrow \
             $GITHUB_WORKSPACE/arrow/cpp-build \
             $GITHUB_WORKSPACE/arrow/java-dist
-      - name: Compress into single artifact
+      - name: Compress into single artifact to keep directory structure
         run: tar -cvzf arrow-shared-libs-macos.tar.gz arrow/java-dist/
       - name: Upload Artifacts
         uses: actions/upload-artifact@v2
@@ -93,10 +86,11 @@ jobs:
           name: macos-shared-lib
       - name: Descompress artifacts
         run: |
-          tar -xvzf arrow-shared-libs-macos.tar.gz
           tar -xvzf arrow-shared-libs-linux.tar.gz
+          tar -xvzf arrow-shared-libs-macos.tar.gz
       - name: Test that Shared Libraries Exist
         run: |
+          set -x
           test -f arrow/java-dist/libarrow_cdata_jni.dylib
           test -f arrow/java-dist/libarrow_dataset_jni.dylib
           test -f arrow/java-dist/libgandiva_jni.dylib
diff --git a/docker-compose.yml b/docker-compose.yml
index 7902aebe2e..c476797f22 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -964,7 +964,6 @@ services:
       - ${DOCKER_VOLUME_PREFIX}python-wheel-manylinux2014-ccache:/ccache:delegated
     command:
       ["pip install -e /arrow/dev/archery &&
-        /arrow/ci/scripts/java_cdata_build.sh /arrow /java-native-build /arrow/java-dist &&
         /arrow/ci/scripts/java_jni_manylinux_build.sh /arrow /build /arrow/java-dist"]
 
   ##############################  Integration #################################
@@ -1117,6 +1116,9 @@ services:
       ARROW_ORC: "OFF"
       ARROW_PARQUET: "OFF"
       ARROW_PLASMA: "OFF"
+      JAVA_JNI_CMAKE_ARGS: >-
+        -DARROW_JAVA_JNI_ENABLE_DEFAULT=OFF
+        -DARROW_JAVA_JNI_ENABLE_C=ON
     volumes:
       - .:/arrow:delegated
       - ${DOCKER_VOLUME_PREFIX}maven-cache:/root/.m2:delegated
@@ -1124,9 +1126,9 @@ services:
     command:
       [ "/arrow/ci/scripts/cpp_build.sh /arrow /build &&
           /arrow/ci/scripts/python_build.sh /arrow /build &&
-          /arrow/ci/scripts/java_cdata_build.sh /arrow /build/java/c/build /build/java/c &&
-          /arrow/ci/scripts/java_build.sh /arrow /build &&
-          /arrow/ci/scripts/java_cdata_integration.sh /arrow" ]
+          /arrow/ci/scripts/java_jni_build.sh /arrow /build /tmp/dist/java &&
+          /arrow/ci/scripts/java_build.sh /arrow /build /tmp/dist/java &&
+          /arrow/ci/scripts/java_cdata_integration.sh /arrow /tmp/dist/java" ]
 
   conda-python-turbodbc:
     # Possible $TURBODBC parameters:
@@ -1524,9 +1526,9 @@ services:
     command:
       /bin/bash -c "
         /arrow/ci/scripts/cpp_build.sh /arrow /build &&
-        /arrow/ci/scripts/java_cdata_build.sh /arrow /build/java/c/build /build/java/c &&
-        /arrow/ci/scripts/java_build.sh /arrow /build &&
-        /arrow/ci/scripts/java_test.sh /arrow /build"
+        /arrow/ci/scripts/java_jni_build.sh /arrow /build /tmp/java_dist &&
+        /arrow/ci/scripts/java_build.sh /arrow /build /tmp/java_dist &&
+        /arrow/ci/scripts/java_test.sh /arrow /build /tmp/java_dist"
 
   oracle-java:
     # Usage:
diff --git a/docs/source/developers/java/building.rst b/docs/source/developers/java/building.rst
index b7b9cb9213..2824649253 100644
--- a/docs/source/developers/java/building.rst
+++ b/docs/source/developers/java/building.rst
@@ -92,9 +92,8 @@ To build only the C Data Interface library:
     $ cd java-native-c
     $ cmake \
         -DCMAKE_BUILD_TYPE=Release \
-        -DCMAKE_INSTALL_LIBDIR=lib \
-        -DCMAKE_INSTALL_PREFIX=../java-dist \
-        ../java/c
+        -DCMAKE_INSTALL_PREFIX=../java-dist/lib \
+        ../java
     $ cmake --build . --target install
     $ ls -latr ../java-dist/lib
     |__ libarrow_cdata_jni.dylib
diff --git a/java/.gitignore b/java/.gitignore
index 302c528e4d..376e06946d 100644
--- a/java/.gitignore
+++ b/java/.gitignore
@@ -1,25 +1,25 @@
-.project
+*.DS_Store
+*.iml
+*.lck
+*.log
+*.patch
+*~
 .buildpath
-.classpath
 .checkstyle
+.classpath
 .factorypath
-.settings/
 .idea/
-TAGS
-*.log
-*.lck
-*.iml
-target/
-*.DS_Store
-*.patch
-*~
-arrow-git.properties
-contrib/native/client/build/
-contrib/native/client/build/*
+.project
+.settings/
+/build/
+/*-build/
 CMakeCache.txt
-CMakeFiles
+CMakeFiles/
 Makefile
+TAGS
+arrow-git.properties
 cmake_install.cmake
 install_manifest.txt
+target/
 ?/
-!c/
+!/c/
diff --git a/java/CMakeLists.txt b/java/CMakeLists.txt
new file mode 100644
index 0000000000..43818e7a9f
--- /dev/null
+++ b/java/CMakeLists.txt
@@ -0,0 +1,59 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+cmake_minimum_required(VERSION 3.11)
+message(STATUS "Building using CMake version: ${CMAKE_VERSION}")
+
+project(arrow-java-jni)
+
+if("${CMAKE_CXX_STANDARD}" STREQUAL "")
+  set(CMAKE_CXX_STANDARD 11)
+endif()
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+# Components
+option(ARROW_JAVA_JNI_ENABLE_DEFAULT "Whether enable components by default or not" ON)
+option(ARROW_JAVA_JNI_ENABLE_C "Enable C data interface" ${ARROW_JAVA_JNI_ENABLE_DEFAULT})
+
+# ccache
+option(ARROW_JAVA_JNI_USE_CCACHE "Use ccache when compiling (if available)" ON)
+if(ARROW_USE_CCACHE
+   AND NOT CMAKE_C_COMPILER_LAUNCHER
+   AND NOT CMAKE_CXX_COMPILER_LAUNCHER)
+  find_program(CCACHE ccache)
+  if(CCACHE)
+    message(STATUS "Using ccache: ${CCACHE}")
+    set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
+    set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
+    # ARROW-3985: let ccache preserve C++ comments, because some of them may be
+    # meaningful to the compiler
+    set(ENV{CCACHE_COMMENTS} "1")
+  endif()
+endif()
+
+# Build
+find_package(Java REQUIRED)
+find_package(JNI REQUIRED)
+
+include(UseJava)
+
+add_library(jni INTERFACE IMPORTED)
+set_target_properties(jni PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${JNI_INCLUDE_DIRS}")
+
+if(ARROW_JAVA_JNI_ENABLE_C)
+  add_subdirectory(c)
+endif()
diff --git a/java/c/.gitignore b/java/c/.gitignore
deleted file mode 100644
index e390b124a6..0000000000
--- a/java/c/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-build/**
\ No newline at end of file
diff --git a/java/c/CMakeLists.txt b/java/c/CMakeLists.txt
index 05938508de..f3b3117eac 100644
--- a/java/c/CMakeLists.txt
+++ b/java/c/CMakeLists.txt
@@ -15,38 +15,19 @@
 # specific language governing permissions and limitations
 # under the License.
 
-#
-# arrow_cdata_java
-#
-
-cmake_minimum_required(VERSION 3.11)
-message(STATUS "Building using CMake version: ${CMAKE_VERSION}")
-project(arrow_cdata_java)
-
-# Find java/jni
-include(UseJava)
-
-find_package(Java REQUIRED)
-find_package(JNI REQUIRED)
-
-set(JNI_HEADERS_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
-
 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
                     ${JNI_INCLUDE_DIRS} ${JNI_HEADERS_DIR})
 
-add_jar(${PROJECT_NAME}
+add_jar(arrow_cdata_jar
         src/main/java/org/apache/arrow/c/jni/CDataJniException.java
         src/main/java/org/apache/arrow/c/jni/JniLoader.java
         src/main/java/org/apache/arrow/c/jni/JniWrapper.java
         src/main/java/org/apache/arrow/c/jni/PrivateData.java
         GENERATE_NATIVE_HEADERS
-        arrow_cdata_java-native
-        DESTINATION
-        ${JNI_HEADERS_DIR})
+        arrow_cdata_jni_headers)
 
-set(SOURCES src/main/cpp/jni_wrapper.cc)
-add_library(arrow_cdata_jni SHARED ${SOURCES})
-target_link_libraries(arrow_cdata_jni ${JAVA_JVM_LIBRARY})
-add_dependencies(arrow_cdata_jni ${PROJECT_NAME})
+set(ARROW_CDATA_JNI_SOURCES src/main/cpp/jni_wrapper.cc)
+add_library(arrow_cdata_jni SHARED ${ARROW_CDATA_JNI_SOURCES})
+target_link_libraries(arrow_cdata_jni arrow_cdata_jni_headers jni)
 
-install(TARGETS arrow_cdata_jni DESTINATION ${CMAKE_INSTALL_LIBDIR})
+install(TARGETS arrow_cdata_jni DESTINATION ${CMAKE_INSTALL_PREFIX})