Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/jni #152

Merged
merged 55 commits into from
Apr 24, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
c86d6ad
Check for errors on Unix scripts
Feb 18, 2020
f33c019
Fix conan dependency on Unix
Feb 18, 2020
61a3191
Fix compiler version for Linux builds
Feb 18, 2020
48e3862
Fix CI
Feb 18, 2020
fefaf2f
Fix wget error on osx CI
Feb 18, 2020
4020678
Merge remote-tracking branch 'origin/master' into v0.5.0
Feb 19, 2020
1448d93
Add remote google-benchmark dependency to fix build
Feb 19, 2020
46cac76
Merge branch 'v0.5.0' of github.com:shapelets/khiva into v0.5.0
Feb 19, 2020
0d13026
Modify CI to build all on every PR
Feb 19, 2020
5ab8417
Fix Appveyor build
Feb 19, 2020
68e7518
remote debug appveyor
Feb 19, 2020
2f4c673
Fix link error on Visual Studio 2015
Feb 19, 2020
33a36dc
Fix Visual Studio 2015 CI build
Feb 19, 2020
49aebde
Remote debug vs 2015 build
Feb 19, 2020
da90c73
Fix VS 2015 link error
Feb 19, 2020
38c363e
Fix yaml
Feb 19, 2020
052b1b9
Improve build time by donwloading only reuiqred boost packages
Feb 19, 2020
8179f37
Merge branch 'master' into v0.5.0
raulbocanegra Feb 19, 2020
bc06dc5
Use empty body for deploy.body in Travis
Feb 20, 2020
fc43bfe
Use travis tag as body
Feb 20, 2020
14b4e4c
Merge branch 'master' into v0.5.0
raulbocanegra Feb 20, 2020
f06e373
Improve const correctness on Khiva C
Apr 4, 2020
ebfb5b9
Implement Clang Tidy checks
Apr 4, 2020
1a9d0d9
Improve const correctness on Khiva
Apr 4, 2020
8f4cff6
Implement Clang Tidy checks
Apr 4, 2020
5bd79cc
Merge remote-tracking branch 'origin/master' into v0.5.0
Apr 4, 2020
632fe23
Removed unused headers
Apr 4, 2020
ea1d37e
Fix compilation on Windows
Apr 5, 2020
093d538
Fix compilation for MSVC 2017
Apr 5, 2020
a02558c
Release improvements
Apr 6, 2020
be5f8c3
Remove unnecesary cache dirs on Travis
Apr 6, 2020
f1bbe06
Fix MSVC 2015 build
Apr 6, 2020
7544d50
Pass array objects by const ref
Apr 7, 2020
d3bd32b
Fix MSVC build
Apr 7, 2020
83eda93
Remove warnings
Apr 7, 2020
a31307c
Review Changes
Apr 7, 2020
9eaf8a5
Update travis yaml
Apr 7, 2020
b32c07f
Fix version on deploy
Apr 8, 2020
e472e94
Merge branch 'master' into v0.5.0
raulbocanegra Apr 8, 2020
8be8053
Fix Mac Deploy
Apr 8, 2020
f2b7e6d
Force deploy on Mac for regular branches
Apr 8, 2020
02b8456
Fix yaml for mac
Apr 8, 2020
81aeb03
Fix Heap corruption error on Windows
Apr 18, 2020
2d4da80
Merge remote-tracking branch 'origin/master' into fix/jni
Apr 18, 2020
c136fb1
Refactor to use pointer to af:array instead of af_array
Apr 19, 2020
8bcbba9
FIx Travis CI
Apr 20, 2020
fa27d70
Remove unused test folder from jni bindings
Apr 20, 2020
e182e36
Address review comments
Apr 20, 2020
c27445a
Clang Tidy fixes
Apr 20, 2020
eded894
Update CI
Apr 21, 2020
1767506
Merge branch 'fix/jni' of github.com:shapelets/khiva into fix/jni
Apr 20, 2020
8f74a33
Use io/shapelets/khiva/KhivaException instead of java/lang/Exception
Apr 22, 2020
8a4b976
Merge remote-tracking branch 'origin/master' into fix/jni
Apr 22, 2020
43b1b0b
Refactor JNI bindings to remove C Macro functions
Apr 23, 2020
671bb66
Fix compilation
Apr 24, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion bindings/jni/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ set(KHIVALIB_JNI_HEADERS ${KHIVALIB_JNI_INC}/khiva_jni/array.h
${KHIVALIB_JNI_INC}/khiva_jni/regression.h
${KHIVALIB_JNI_INC}/khiva_jni/regularization.h
${KHIVALIB_JNI_INC}/khiva_jni/statistics.h
${KHIVALIB_JNI_INC}/khiva_jni/internal/utils.h)
${KHIVALIB_JNI_INC}/khiva_jni/internal/utils.h
${KHIVALIB_JNI_INC}/khiva_jni/internal/jni_traits.h)

# Sources to add to compilation
set(KHIVALIB_JNI_SOURCES ${KHIVALIB_JNI_SRC}/array.cpp
Expand Down
131 changes: 109 additions & 22 deletions bindings/jni/include/khiva_jni/array.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,72 @@ extern "C" {
*
* @return The array reference.
*/
#define CREATE_T_ARRAY(Ty, ty, dty) \
JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFrom##Ty(JNIEnv *env, jobject, \
j##ty##Array elems, jlongArray dims);
CREATE_T_ARRAY(Float, float, khiva::dtype::f32)
CREATE_T_ARRAY(Double, double, khiva::dtype::f64)
CREATE_T_ARRAY(Int, int, khiva::dtype::s32)
CREATE_T_ARRAY(Boolean, boolean, khiva::dtype::b8)
CREATE_T_ARRAY(Long, long, khiva::dtype::s64)
CREATE_T_ARRAY(Short, short, khiva::dtype::s16)
CREATE_T_ARRAY(Byte, byte, khiva::dtype::u8)
JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromFloat(JNIEnv *env, jobject, jfloatArray elems,
jlongArray dims);

#undef CREATE_T_ARRAY
/**
* @brief Creates an Array object of Double.
*
* @param elems Data used in order to create the array.
* @param dims Cardinality of dimensions of the data.
*
* @return The array reference.
*/
JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromDouble(JNIEnv *env, jobject, jdoubleArray elems,
jlongArray dims);
/**
* @brief Creates an Array object of Int.
*
* @param elems Data used in order to create the array.
* @param dims Cardinality of dimensions of the data.
*
* @return The array reference.
*/
JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromInt(JNIEnv *env, jobject, jintArray elems,
jlongArray dims);
/**
* @brief Creates an Array object of Boolean.
*
* @param elems Data used in order to create the array.
* @param dims Cardinality of dimensions of the data.
*
* @return The array reference.
*/
JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromBoolean(JNIEnv *env, jobject, jbooleanArray elems,
jlongArray dims);

/**
* @brief Creates an Array object of Long.
*
* @param elems Data used in order to create the array.
* @param dims Cardinality of dimensions of the data.
*
* @return The array reference.
*/
JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromLong(JNIEnv *env, jobject, jlongArray elems,
jlongArray dims);

/**
* @brief Creates an Array object of Short.
*
* @param elems Data used in order to create the array.
* @param dims Cardinality of dimensions of the data.
*
* @return The array reference.
*/
JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromShort(JNIEnv *env, jobject, jshortArray elems,
jlongArray dims);

/**
* @brief Creates an Array object of Byte.
*
* @param elems Data used in order to create the array.
* @param dims Cardinality of dimensions of the data.
*
* @return The array reference.
*/
JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromByte(JNIEnv *env, jobject, jbyteArray elems,
jlongArray dims);

/**
* @brief Creates an Array object of Float Complex.
Expand Down Expand Up @@ -62,20 +116,53 @@ JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromDoubleCompl
JNIEXPORT void JNICALL Java_io_shapelets_khiva_Array_deleteArray(JNIEnv *env, jobject thisObj);

/**
* @brief Retrieves data from the device to host (Float, Double, Int, Boolean, Long, Short or Byte).
* @brief Retrieves data from the device to host.
*
* @return Array with the data.
*/
JNIEXPORT jfloatArray JNICALL Java_io_shapelets_khiva_Array_getFloatFromArray(JNIEnv *env, jobject thisObj);

/**
* @brief Retrieves data from the device to host.
*
* @return Array with the data.
*/
JNIEXPORT jdoubleArray JNICALL Java_io_shapelets_khiva_Array_getDoubleFromArray(JNIEnv *env, jobject thisObj);

/**
* @brief Retrieves data from the device to host.
*
* @return Array with the data.
*/
JNIEXPORT jintArray JNICALL Java_io_shapelets_khiva_Array_getIntFromArray(JNIEnv *env, jobject thisObj);

/**
* @brief Retrieves data from the device to host.
*
* @return Array with the data.
*/
JNIEXPORT jbooleanArray JNICALL Java_io_shapelets_khiva_Array_getBooleanFromArray(JNIEnv *env, jobject thisObj);

/**
* @brief Retrieves data from the device to host.
*
* @return Array with the data.
*/
JNIEXPORT jlongArray JNICALL Java_io_shapelets_khiva_Array_getLongFromArray(JNIEnv *env, jobject thisObj);

/**
* @brief Retrieves data from the device to host.
*
* @return Array with the data.
*/
JNIEXPORT jshortArray JNICALL Java_io_shapelets_khiva_Array_getShortFromArray(JNIEnv *env, jobject thisObj);

/**
* @brief Retrieves data from the device to host.
*
* @return Array with the data.
*/
#define GET_T_FROM_ARRAY(Ty, ty) \
JNIEXPORT j##ty##Array JNICALL Java_io_shapelets_khiva_Array_get##Ty##FromArray(JNIEnv *env, jobject thisObj);
GET_T_FROM_ARRAY(Float, float)
GET_T_FROM_ARRAY(Double, double)
GET_T_FROM_ARRAY(Int, int)
GET_T_FROM_ARRAY(Boolean, boolean)
GET_T_FROM_ARRAY(Long, long)
GET_T_FROM_ARRAY(Short, short)
GET_T_FROM_ARRAY(Byte, byte)
#undef GET_T_FROM_ARRAY
JNIEXPORT jbyteArray JNICALL Java_io_shapelets_khiva_Array_getByteFromArray(JNIEnv *env, jobject thisObj);

/**
* @brief Retrieves data from the device to host (Double Complex).
Expand Down
104 changes: 104 additions & 0 deletions bindings/jni/include/khiva_jni/internal/jni_traits.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// Copyright (c) 2019 Shapelets.io
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

#ifndef KHIVA_BINDINGJAVA_INTERNAL_JNI_TRAITS_H
#define KHIVA_BINDINGJAVA_INTERNAL_JNI_TRAITS_H

#include <jni.h>
#include <khiva/array.h>

namespace khiva {
namespace jni {

template <typename T>
struct ArrayTraits {};

template <>
struct ArrayTraits<float> {
using JavaType = jfloat;
using JavaTypePtr = jfloat *;
using JavaArrayType = jfloatArray;

static constexpr auto type = khiva::dtype::f32;
static constexpr auto newArray = &JNIEnv::NewFloatArray;
static constexpr auto getArrayElements = &JNIEnv::GetFloatArrayElements;
static constexpr auto releaseArrayElements = &JNIEnv::ReleaseFloatArrayElements;
};

template <>
struct ArrayTraits<double> {
using JavaType = jdouble;
using JavaTypePtr = jdouble *;
using JavaArrayType = jdoubleArray;

static constexpr auto type = khiva::dtype::f64;
static constexpr auto newArray = &JNIEnv::NewDoubleArray;
static constexpr auto getArrayElements = &JNIEnv::GetDoubleArrayElements;
static constexpr auto releaseArrayElements = &JNIEnv::ReleaseDoubleArrayElements;
};

template <>
struct ArrayTraits<int> {
using JavaType = jint;
using JavaTypePtr = jint *;
using JavaArrayType = jintArray;

static constexpr auto type = khiva::dtype::s32;
static constexpr auto newArray = &JNIEnv::NewIntArray;
static constexpr auto getArrayElements = &JNIEnv::GetIntArrayElements;
static constexpr auto releaseArrayElements = &JNIEnv::ReleaseIntArrayElements;
};

template <>
struct ArrayTraits<bool> {
using JavaType = jboolean;
using JavaTypePtr = jboolean *;
using JavaArrayType = jbooleanArray;

static constexpr auto type = khiva::dtype::b8;
static constexpr auto newArray = &JNIEnv::NewBooleanArray;
static constexpr auto getArrayElements = &JNIEnv::GetBooleanArrayElements;
static constexpr auto releaseArrayElements = &JNIEnv::ReleaseBooleanArrayElements;
};

template <>
struct ArrayTraits<long> {
using JavaType = jlong;
using JavaTypePtr = jlong *;
using JavaArrayType = jlongArray;

static constexpr auto type = khiva::dtype::s64;
static constexpr auto newArray = &JNIEnv::NewLongArray;
static constexpr auto getArrayElements = &JNIEnv::GetLongArrayElements;
static constexpr auto releaseArrayElements = &JNIEnv::ReleaseLongArrayElements;
};

template <>
struct ArrayTraits<short> {
using JavaType = jshort;
using JavaTypePtr = jshort *;
using JavaArrayType = jshortArray;

static constexpr auto type = khiva::dtype::s16;
static constexpr auto newArray = &JNIEnv::NewShortArray;
static constexpr auto getArrayElements = &JNIEnv::GetShortArrayElements;
static constexpr auto releaseArrayElements = &JNIEnv::ReleaseShortArrayElements;
};

template <>
struct ArrayTraits<jbyte> {
using JavaType = jbyte;
using JavaTypePtr = jbyte *;
using JavaArrayType = jbyteArray;

static constexpr auto type = khiva::dtype::u8;
static constexpr auto newArray = &JNIEnv::NewByteArray;
static constexpr auto getArrayElements = &JNIEnv::GetByteArrayElements;
static constexpr auto releaseArrayElements = &JNIEnv::ReleaseByteArrayElements;
};
} // namespace jni
} // namespace khiva
#endif
8 changes: 4 additions & 4 deletions bindings/jni/include/khiva_jni/internal/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ jlong KhivaCall(JNIEnv *env, Func f, jlong ref, Args &&... args) {
auto result = f(arr, std::forward<Args>(args)...);
return reinterpret_cast<jlong>(new af::array(result));
} catch (const std::exception &e) {
auto exceptionClass = env->FindClass("java/lang/Exception");
auto exceptionClass = env->FindClass("io/shapelets/khiva/KhivaException");
env->ThrowNew(exceptionClass, e.what());
} catch (...) {
auto exceptionClass = env->FindClass("java/lang/Exception");
auto exceptionClass = env->FindClass("io/shapelets/khiva/KhivaException");
env->ThrowNew(exceptionClass, "Unknown error executing native function");
}
return 0;
Expand All @@ -36,10 +36,10 @@ jlong KhivaCallTwoArrays(JNIEnv *env, Func f, jlong ref_a, jlong ref_b, Args &&.
auto result = f(arr_a, arr_b, std::forward<Args>(args)...);
return reinterpret_cast<jlong>(new af::array(result));
} catch (const std::exception &e) {
auto exceptionClass = env->FindClass("java/lang/Exception");
auto exceptionClass = env->FindClass("io/shapelets/khiva/KhivaException");
env->ThrowNew(exceptionClass, e.what());
} catch (...) {
auto exceptionClass = env->FindClass("java/lang/Exception");
auto exceptionClass = env->FindClass("io/shapelets/khiva/KhivaException");
env->ThrowNew(exceptionClass, "Unknown error executing native function");
}
return 0;
Expand Down
Loading