Android に移植したい既存の C++ プロジェクトがあります。残念ながら、このプログラムは Android で「Fatal signal 7 (SIGBUS)」エラーを引き起こします。他のプラットフォーム (32 ビット/64 ビットの Linux および Windows) では問題なく動作しています。問題を引き起こすコードの一部は次のとおりです。
RawMem3::RawMem3(uint8_t packet_version, uint32_t flags, uint64_t packet_id,
uint64_t packet_nr, uint64_t timestamp, vector<uint16_t>& nr_channels,
vector<uint16_t>& samples_per_channel, vector<double>& data) :
size_(0) {
size_ = sizeof(packet_version) + sizeof(size_) + sizeof(flags)
+ sizeof(packet_id) + sizeof(packet_nr) + sizeof(timestamp)
+ nr_channels.size() * sizeof(boost::uint16_t)
+ samples_per_channel.size() * sizeof(boost::uint16_t)
+ data.size() * sizeof(float); // FIXXXXXME ... hardcoded sizeof() !!!!
mem_ = malloc(size_);
uint8_t* ui8_ptr = reinterpret_cast<uint8_t*>(mem_);
*ui8_ptr++ = packet_version;
uint32_t* ui32_ptr = reinterpret_cast<uint32_t*>(ui8_ptr);
*ui32_ptr++ = size_;
*ui32_ptr++ = flags;
uint64_t* ui64_ptr = reinterpret_cast<uint64_t*>(ui32_ptr);
*ui64_ptr++ = packet_id;
*ui64_ptr++ = packet_nr;
uint64_t* time_ptr = reinterpret_cast<uint64_t*>(ui64_ptr);
*time_ptr++ = timestamp;
uint16_t* ui16_ptr = reinterpret_cast<uint16_t*>(time_ptr);
for (unsigned int n = 0; n < nr_channels.size(); n++)
*ui16_ptr++ = nr_channels[n];
for (unsigned int n = 0; n < samples_per_channel.size(); n++)
*ui16_ptr++ = samples_per_channel[n];
try {
float* flt_ptr = reinterpret_cast<float*>(ui16_ptr);
for (unsigned int n = 0; n < data.size(); n++)
*flt_ptr++ = numeric_cast<float>(data[n]);
} catch (negative_overflow& e) {
cerr << "RawMem -- Constructor: " << e.what();
} catch (positive_overflow& e) {
cerr << "RawMem -- Constructor: " << e.what();
} catch (bad_numeric_cast& e) {
cerr << "RawMem -- Constructor: " << e.what();
}
厳密に言えば、この部分:
uint32_t* ui32_ptr = reinterpret_cast<uint32_t*>(ui8_ptr);
*ui32_ptr++ = size_;
*ui32_ptr++ = flags
アライメントの問題だと思います。私はその専門家ではないので、これを修正する方法はありますか?私はすでに に変更しようとしpacket_version
ましたuint32_t
。その後、SIGBUS エラーはなくなりましたが、私のクライアント ソフトウェアpacked_version
はuint8_t
. クライアント コードを変更できないため、別の方法で修正する必要があります。