Build and install JNI if header and Java compiler are found
This commit is contained in:
62
meson.build
62
meson.build
@@ -90,12 +90,21 @@ general_include_dirs = [
|
|||||||
|
|
||||||
# Scan for any dependencies we may use later; all are optional
|
# Scan for any dependencies we may use later; all are optional
|
||||||
|
|
||||||
|
extra_include_args = []
|
||||||
|
foreach d: get_option('extra_include_dirs')
|
||||||
|
extra_include_args += [ '-I' + d ]
|
||||||
|
endforeach
|
||||||
|
|
||||||
fftw3_dep = dependency('fftw3', version: '>= 3.0.0', required: false)
|
fftw3_dep = dependency('fftw3', version: '>= 3.0.0', required: false)
|
||||||
samplerate_dep = dependency('samplerate', version: '>= 0.1.8', required: false)
|
samplerate_dep = dependency('samplerate', version: '>= 0.1.8', required: false)
|
||||||
sndfile_dep = dependency('sndfile', version: '>= 1.0.16', required: false)
|
sndfile_dep = dependency('sndfile', version: '>= 1.0.16', required: false)
|
||||||
vamp_dep = dependency('vamp-sdk', version: '>= 2.9', required: false)
|
vamp_dep = dependency('vamp-sdk', version: '>= 2.9', required: false)
|
||||||
thread_dep = dependency('threads')
|
thread_dep = dependency('threads')
|
||||||
have_ladspa = cpp.has_header('ladspa.h')
|
have_ladspa = cpp.has_header('ladspa.h', args: extra_include_args)
|
||||||
|
have_jni = cpp.has_header('jni.h', args: extra_include_args)
|
||||||
|
|
||||||
|
javac = find_program('javac')
|
||||||
|
jar = find_program('jar')
|
||||||
|
|
||||||
|
|
||||||
# Check FFT and resampler options and set up dependencies and paths
|
# Check FFT and resampler options and set up dependencies and paths
|
||||||
@@ -131,11 +140,6 @@ if resampler == 'auto'
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
extra_include_args = []
|
|
||||||
foreach d: get_option('extra_include_dirs')
|
|
||||||
extra_include_args += [ '-I' + d ]
|
|
||||||
endforeach
|
|
||||||
|
|
||||||
if fft == 'kissfft'
|
if fft == 'kissfft'
|
||||||
config_summary += { 'FFT': 'KissFFT' }
|
config_summary += { 'FFT': 'KissFFT' }
|
||||||
message('For FFT: using KissFFT')
|
message('For FFT: using KissFFT')
|
||||||
@@ -362,6 +366,7 @@ if system == 'windows'
|
|||||||
rubberband_program_name = 'rubberband-program'
|
rubberband_program_name = 'rubberband-program'
|
||||||
rubberband_ladspa_name = 'ladspa-rubberband'
|
rubberband_ladspa_name = 'ladspa-rubberband'
|
||||||
rubberband_vamp_name = 'vamp-rubberband'
|
rubberband_vamp_name = 'vamp-rubberband'
|
||||||
|
rubberband_jni_name = 'rubberband-jni'
|
||||||
# Meson likes libxxx.a even on Windows, and so might we for a
|
# Meson likes libxxx.a even on Windows, and so might we for a
|
||||||
# new library, but not here
|
# new library, but not here
|
||||||
platform_static_name_prefix = ''
|
platform_static_name_prefix = ''
|
||||||
@@ -372,13 +377,14 @@ else
|
|||||||
rubberband_program_name = 'rubberband'
|
rubberband_program_name = 'rubberband'
|
||||||
rubberband_ladspa_name = 'ladspa-rubberband'
|
rubberband_ladspa_name = 'ladspa-rubberband'
|
||||||
rubberband_vamp_name = 'vamp-rubberband'
|
rubberband_vamp_name = 'vamp-rubberband'
|
||||||
|
rubberband_jni_name = 'rubberband-jni'
|
||||||
platform_static_name_prefix = 'lib'
|
platform_static_name_prefix = 'lib'
|
||||||
platform_static_name_suffix = 'a'
|
platform_static_name_suffix = 'a'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
# And the build targets: Static and dynamic libraries, command-line
|
# And the build targets: Static and dynamic libraries, command-line
|
||||||
# utility, LADSPA plugin, Vamp plugin
|
# utility, LADSPA plugin, Vamp plugin, JNI library
|
||||||
|
|
||||||
message('Will build Rubber Band Library static library')
|
message('Will build Rubber Band Library static library')
|
||||||
target_summary += { 'Static library': [ true, 'Name: ' + rubberband_static_name ] }
|
target_summary += { 'Static library': [ true, 'Name: ' + rubberband_static_name ] }
|
||||||
@@ -419,6 +425,48 @@ else
|
|||||||
message('Not building Rubber Band Library dynamic library: no_shared option set')
|
message('Not building Rubber Band Library dynamic library: no_shared option set')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if have_jni and javac.found() and jar.found()
|
||||||
|
target_summary += { 'JNI library': [ true, 'Name: ' + rubberband_jni_name ] }
|
||||||
|
message('Will build Java Native Interface')
|
||||||
|
rubberband_jni = shared_library(
|
||||||
|
rubberband_jni_name,
|
||||||
|
jni_sources,
|
||||||
|
include_directories: general_include_dirs,
|
||||||
|
cpp_args: general_compile_args,
|
||||||
|
c_args: general_compile_args,
|
||||||
|
link_args: [
|
||||||
|
arch_flags,
|
||||||
|
feature_libraries,
|
||||||
|
],
|
||||||
|
dependencies: [
|
||||||
|
rubberband_static_dep,
|
||||||
|
general_dependencies,
|
||||||
|
],
|
||||||
|
# NB the JNI library is not versioned
|
||||||
|
install: true,
|
||||||
|
)
|
||||||
|
rubberband_class = custom_target(
|
||||||
|
'rubberband_class',
|
||||||
|
input: 'com/breakfastquay/rubberband/RubberBandStretcher.java',
|
||||||
|
output: 'RubberBandStretcher.class',
|
||||||
|
command: [ javac, '@INPUT@', '-d', '@OUTDIR@' ],
|
||||||
|
)
|
||||||
|
rubberband_jar = custom_target(
|
||||||
|
'rubberband_jar',
|
||||||
|
input: rubberband_class,
|
||||||
|
output: 'rubberband.jar',
|
||||||
|
command: [ jar, 'cvf', '@OUTPUT@', 'com/breakfastquay/rubberband/@INPUT@' ],
|
||||||
|
build_by_default: true,
|
||||||
|
)
|
||||||
|
else
|
||||||
|
target_summary += { 'JNI library': false }
|
||||||
|
if not have_jni
|
||||||
|
message('Not building Java Native Interface: jni.h header not found')
|
||||||
|
else
|
||||||
|
message('Not building Java Native Interface: Java compiler not found')
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
install_headers(
|
install_headers(
|
||||||
[ 'rubberband/RubberBandStretcher.h',
|
[ 'rubberband/RubberBandStretcher.h',
|
||||||
'rubberband/rubberband-c.h'
|
'rubberband/rubberband-c.h'
|
||||||
|
|||||||
@@ -329,7 +329,6 @@ Java_com_breakfastquay_rubberband_RubberBandStretcher_study(JNIEnv *env, jobject
|
|||||||
int channels = env->GetArrayLength(data);
|
int channels = env->GetArrayLength(data);
|
||||||
float **arr = allocate<float *>(channels);
|
float **arr = allocate<float *>(channels);
|
||||||
float **input = allocate<float *>(channels);
|
float **input = allocate<float *>(channels);
|
||||||
int samples = 0;
|
|
||||||
for (int c = 0; c < channels; ++c) {
|
for (int c = 0; c < channels; ++c) {
|
||||||
jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
|
jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
|
||||||
arr[c] = env->GetFloatArrayElements(cdata, 0);
|
arr[c] = env->GetFloatArrayElements(cdata, 0);
|
||||||
@@ -350,7 +349,6 @@ Java_com_breakfastquay_rubberband_RubberBandStretcher_process(JNIEnv *env, jobje
|
|||||||
int channels = env->GetArrayLength(data);
|
int channels = env->GetArrayLength(data);
|
||||||
float **arr = allocate<float *>(channels);
|
float **arr = allocate<float *>(channels);
|
||||||
float **input = allocate<float *>(channels);
|
float **input = allocate<float *>(channels);
|
||||||
int samples = 0;
|
|
||||||
for (int c = 0; c < channels; ++c) {
|
for (int c = 0; c < channels; ++c) {
|
||||||
jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
|
jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
|
||||||
arr[c] = env->GetFloatArrayElements(cdata, 0);
|
arr[c] = env->GetFloatArrayElements(cdata, 0);
|
||||||
@@ -383,7 +381,7 @@ Java_com_breakfastquay_rubberband_RubberBandStretcher_retrieve(JNIEnv *env, jobj
|
|||||||
float **outbuf = allocate_channels<float>(channels, n);
|
float **outbuf = allocate_channels<float>(channels, n);
|
||||||
size_t retrieved = stretcher->retrieve(outbuf, n);
|
size_t retrieved = stretcher->retrieve(outbuf, n);
|
||||||
|
|
||||||
for (int c = 0; c < channels; ++c) {
|
for (size_t c = 0; c < channels; ++c) {
|
||||||
jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(output, c);
|
jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(output, c);
|
||||||
env->SetFloatArrayRegion(cdata, offset, retrieved, outbuf[c]);
|
env->SetFloatArrayRegion(cdata, offset, retrieved, outbuf[c]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user