diff --git a/meson.build b/meson.build index 3238f2e..c76fec4 100644 --- a/meson.build +++ b/meson.build @@ -90,12 +90,21 @@ general_include_dirs = [ # 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) samplerate_dep = dependency('samplerate', version: '>= 0.1.8', required: false) sndfile_dep = dependency('sndfile', version: '>= 1.0.16', required: false) vamp_dep = dependency('vamp-sdk', version: '>= 2.9', required: false) 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 @@ -131,11 +140,6 @@ if resampler == 'auto' endif endif -extra_include_args = [] -foreach d: get_option('extra_include_dirs') - extra_include_args += [ '-I' + d ] -endforeach - if fft == 'kissfft' config_summary += { 'FFT': 'KissFFT' } message('For FFT: using KissFFT') @@ -362,6 +366,7 @@ if system == 'windows' rubberband_program_name = 'rubberband-program' rubberband_ladspa_name = 'ladspa-rubberband' rubberband_vamp_name = 'vamp-rubberband' + rubberband_jni_name = 'rubberband-jni' # Meson likes libxxx.a even on Windows, and so might we for a # new library, but not here platform_static_name_prefix = '' @@ -372,13 +377,14 @@ else rubberband_program_name = 'rubberband' rubberband_ladspa_name = 'ladspa-rubberband' rubberband_vamp_name = 'vamp-rubberband' + rubberband_jni_name = 'rubberband-jni' platform_static_name_prefix = 'lib' platform_static_name_suffix = 'a' endif # 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') 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') 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( [ 'rubberband/RubberBandStretcher.h', 'rubberband/rubberband-c.h' diff --git a/src/jni/RubberBandStretcherJNI.cpp b/src/jni/RubberBandStretcherJNI.cpp index 79baecb..1d50979 100644 --- a/src/jni/RubberBandStretcherJNI.cpp +++ b/src/jni/RubberBandStretcherJNI.cpp @@ -329,7 +329,6 @@ Java_com_breakfastquay_rubberband_RubberBandStretcher_study(JNIEnv *env, jobject int channels = env->GetArrayLength(data); float **arr = allocate(channels); float **input = allocate(channels); - int samples = 0; for (int c = 0; c < channels; ++c) { jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c); arr[c] = env->GetFloatArrayElements(cdata, 0); @@ -350,7 +349,6 @@ Java_com_breakfastquay_rubberband_RubberBandStretcher_process(JNIEnv *env, jobje int channels = env->GetArrayLength(data); float **arr = allocate(channels); float **input = allocate(channels); - int samples = 0; for (int c = 0; c < channels; ++c) { jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c); arr[c] = env->GetFloatArrayElements(cdata, 0); @@ -383,7 +381,7 @@ Java_com_breakfastquay_rubberband_RubberBandStretcher_retrieve(JNIEnv *env, jobj float **outbuf = allocate_channels(channels, 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); env->SetFloatArrayRegion(cdata, offset, retrieved, outbuf[c]); }