1

更新:もう少し読んだ後、この問題は完全に一般的であることがわかりました。同じプロセスでアーキテクチャを混在させることはできないため、64ビットJavaはdlopen()FMODのような32ビットライブラリにはできません。FMODライブラリへの独自のCインターフェイスを作成していることを念頭に置いて、これに対する可能な回避策はありますか?

Java Native Accessは64ビットマシン上の64ビットライブラリのみを好むため、MaxOSXで64ビットdylibを作成する必要があります。問題は、私のCソースコードに動的にFMODが含まれていることです。これは、Macでは32ビットのdylibのみを提供します。-m32オプションなしでコンパイルしようとすると(64ビットのdylibを出力する必要があるため)、次のエラーが発生します。

    gcc -dynamiclib -std=c99 -pedantic -Wall -O3 -fPIC -pthread -o  ../bin/libpenntotalrecall_fmod.dylib ../../src/libpenntotalrecall_fmod.c -lfmodex -L../../lib/osx/

    ld: warning: in /usr/lib/libfmodex.dylib, missing required architecture x86_64 in file
    Undefined symbols:
      "_FMOD_System_CreateSound", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_Channel_GetPosition", referenced from:
          _streamPosition in ccJnlwrd.o
      "_FMOD_System_Create", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_System_PlaySound", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_Sound_Release", referenced from:
          _stopPlayback in ccJnlwrd.o
      "_FMOD_Channel_IsPlaying", referenced from:
          _playbackInProgress in ccJnlwrd.o
      "_FMOD_System_Update", referenced from:
          _streamPosition in ccJnlwrd.o
          _startPlayback in ccJnlwrd.o
      "_FMOD_Channel_SetPaused", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_System_Release", referenced from:
          _stopPlayback in ccJnlwrd.o
      "_FMOD_System_Init", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_Channel_SetVolume", referenced from:
          _startPlayback in ccJnlwrd.o
      "_FMOD_System_Close", referenced from:
          _stopPlayback in ccJnlwrd.o
      "_FMOD_Channel_SetCallback", referenced from:
          _startPlayback in ccJnlwrd.o
    ld: symbol(s) not found
    collect2: ld returned 1 exit status
    make: *** [all] Error 1

32ビットライブラリを動的に含むソースコードから64ビットdylibを取得することは可能ではないでしょうか?!

4

3 に答える 3

6

お気づきのように、同じプロセスでアーキテクチャを混在させることはできません。

回避策は、2つのプロセスを持つことです。1つは32ビットライブラリにリンクしてIPCメカニズムを介してその機能を公開する32ビットの「ヘルパー」プロセスであり、もう1つは独自の64ビットライブラリにリンクされた64ビットJavaプロセスです。

64ビットライブラリはヘルパープロセスを起動し、IPCメカニズムを介してヘルパープロセスに要求を渡し、結果を返すことによって実装する一連の関数を提供します。pipe()IPCは、システムコールで作成された無名パイプのペアと同じくらい単純にすることができます。

于 2010-03-10T00:09:59.097 に答える
2

64ビットバイナリは32ビットバイナリにリンクできません。その逆も同様です。必要なライブラリを32ビットで取得できない場合、最善の解決策は、メインプログラムが制御する32ビットプロキシプログラムを作成することです。これは、Safariが10.6でFlashを実行する方法です—Flashプラグインは独自のアドレス空間で実行されます。

于 2010-03-10T00:10:54.850 に答える
1

これに出くわした人への参考までに、FMODの開発リリースにはMacOSX用の64ビットdylibが含まれています。私は今それを使用しています、そしてそれはすぐにAPIのメインラインに移されると確信しています。

于 2010-03-10T05:20:57.210 に答える