如何设置libpd以便在Java中使用?

时间:2017-10-29 10:56:53

标签: java audio puredata synthesizer libpd

PureData是一种用于声音合成的编程语言。 LibPD是它的包装器,所以我们可以在Java / C#/ Android等中使用补丁。 这是包含它的GitHub页面:https://github.com/libpd/libpd

现在在Java中使用LibPD,我想首先我应该将其库导入我的项目,然后使用它的类和方法来调用我的补丁并进行调整。问题是,我找不到要添加到我的项目的jar文件。我是否必须“构建”某些内容以生成jar文件?

如果有人向我解释这个程序,我将不胜感激 感谢

更新1 [2017-01-11]:
关注@umläute的帖子后,我收到以下错误: (我在Windows 7/64位使用MinGWMinGW-make使用make

C:\Users\Name\Documents\GitHub>cd libpd

C:\Users\Name\Documents\GitHub\libpd>git submodule init

C:\Users\Name\Documents\GitHub\libpd>git submodule update

C:\Users\Name\Documents\GitHub\libpd>make javalib
'make' is not recognized as an internal or external command,
operable program or batch file.

C:\Users\Name\Documents\GitHub\libpd>mingw32-make javalib
process_begin: CreateProcess(NULL, uname, ...) failed.
'sed' is not recognized as an internal or external command,
operable program or batch file.
'sed' is not recognized as an internal or external command,
operable program or batch file.
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_arithmetic.o pure-data/src/d_arithmetic.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_array.o pure-data/src/d_array.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_ctl.o pure-data/src/d_ctl.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_dac.o pure-data/src/d_dac.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_delay.o pure-data/src/d_delay.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_fft.o pure-data/src/d_fft.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_fft_fftsg.o pure-data/src/d_fft_fftsg.c
pure-data/src/d_fft_fftsg.c: In function 'mayer_dofft':
pure-data/src/d_fft_fftsg.c:88:11: warning: incompatible implicit declaration of built-in function 'alloca' [enabled by
default]
     buf = alloca(n * (2 * sizeof(FFTFLT)));
           ^
pure-data/src/d_fft_fftsg.c: In function 'mayer_realfft':
pure-data/src/d_fft_fftsg.c:121:11: warning: incompatible implicit declaration of built-in function 'alloca' [enabled by
 default]
     buf = alloca(n * sizeof(FFTFLT));
           ^
pure-data/src/d_fft_fftsg.c: In function 'mayer_realifft':
pure-data/src/d_fft_fftsg.c:139:11: warning: incompatible implicit declaration of built-in function 'alloca' [enabled by
 default]
     buf = alloca(n * sizeof(FFTFLT));
           ^
pure-data/src/d_fft_fftsg.c: In function 'pd_fft':
pure-data/src/d_fft_fftsg.c:156:30: warning: incompatible implicit declaration of built-in function 'alloca' [enabled by
 default]
     FFTFLT *buf2 = (FFTFLT *)alloca(2 * npoints * sizeof(FFTFLT)), *bp2;
                              ^
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_filter.o pure-data/src/d_filter.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_global.o pure-data/src/d_global.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_math.o pure-data/src/d_math.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_osc.o pure-data/src/d_osc.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_resample.o pure-data/src/d_resample.c
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o pure-data/src/d_soundfile.o pure-data/src/d_soundfile.c
pure-data/src/d_soundfile.c:17:21: fatal error: pthread.h: No such file or directory
 #include <pthread.h>
                     ^
compilation terminated.
<builtin>: recipe for target 'pure-data/src/d_soundfile.o' failed
mingw32-make: *** [pure-data/src/d_soundfile.o] Error 1

更新2 [2017-01-11]:
我安装了MSYS2mingw3264以及make(感谢@milleniumbug的帮助)。我已将mingw64make的目录添加到PATH。 现在当我make javalib时,我收到了这个错误:

C:\Users\Name\Documents\GitHub\libpd>make javalib
gcc -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util  -DWINVER=0x502 -DWIN
32 -D_WIN32 -DPD_INTERNAL -I"C:\Program Files\Java\jdk1.8.0_45/include" -I"C:\Program Files\Java\jdk1.8.0_45/include/win
32" -O3   -c -o jni/z_jni_plain.o jni/z_jni_plain.c
In file included from jni/z_jni_shared.c:8:0,
                 from jni/z_jni_plain.c:8:
jni/z_jni.h:2:10: fatal error: jni.h: No such file or directory
 #include <jni.h>
          ^~~~~~~

更新3 [4-11-2017]: 已修复 jni.h问题。我的PATH指向旧的jdk而不是更新的jdk。 现在我收到了这个错误:

C:/msys32/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Cannot export libpd
_set_concatenated_printhook: symbol not found
C:/msys32/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: i386 architecture o
f input file `libpd_wrapper/util/z_print_util.o' is incompatible with i386:x86-64 output
libpd_wrapper/util/z_print_util.o:z_print_util.c:(.text+0x3a): undefined reference to `_strlen'
libpd_wrapper/util/z_print_util.o:z_print_util.c:(.text+0x75): undefined reference to `_strncat'
libpd_wrapper/util/z_print_util.o:z_print_util.c:(.text+0xad): undefined reference to `_strncat'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:163: java-build/org/puredata/core/natives/windows/x86_64//pdnative.dll] Error 1

使用32位MinGW gcc测试...仍然是同样的错误...

更新4 [6-11-2017]:
修正了问题
我似乎设法解决了它。这是我一般的做法:
1-首先我安装了msys2并彻底完成了MinGW32MinGW64以及make 注意:如果您是从旧的原始网站获取的,请删除mingw32。它不再更新,您可能会遇到依赖性问题 2-更改PATH以使用MinGW32(因此gcc -v应报告32位版本)
3-将JAVA_HOME更改为更新的jdk目录。似乎更新java不会自动更新env。变量(这解决了jni header not found问题) 4-安装git并通过libpd命令获取git(按照存储库自述文件中的说明) 5- make clean
6- make clean libpd
7- make clean javalib

我希望这有助于某人

1 个答案:

答案 0 :(得分:1)

libpd Github project包含(与其他源代码存储库一样)libpd的来源(而不是预先构建的二进制文件)。

来自README

  

下载libpd&amp; checkout pure-data子模块执行以下操作:

git clone https://github.com/libpd/libpd.git
cd libpd
git submodule init
git submodule update

它继续建设:

  

目前主要的Makefile在Windows上构建一个动态库(在   MinGW),Linux,&amp; Mac OSX并具有以下目标:

     
      
  • libpd :(默认)构建如果未指定目标,则构建libpd.so/dylib/dll
  •   
  • [...]
  •   
  • javalib:构建libpdnative和jni包装器
  •   
  • clean:删除目标文件
  •   

因此,为了创建您的libs/libpd.jar,请执行以下操作:

make javalib