【发布时间】:2021-03-24 08:41:12
【问题描述】:
Xcode 构建无法识别 C++ .cpp 文件中定义的字节数组 sensor_data_bytes。
它确实可以识别在相同文件中定义的 char 变量,并且还可以识别无符号 sensor_data_bytes。
func peripheral() 接收它需要复制到 C++ char 数组 sensor_data_bytes 的 BLE 通知数据。
结构
我的工作区 Objective-C 应用项目“sim_backend_UI”导入两个静态库项目(A 和 B)。
A)“mobile_sensor_API”包含:
mobile_BLE_central.swift
mobile_sensor_API.h
mobile_sensor_API.mm
mobile_sensor_API-Bridging-Header.h
B) 'mobile_hub' 包含:
sdp_BLE.hpp
sdp.cpp
代码
// sdp_BLE.hpp, C++ in ObjC mobile_hub project
#ifndef BLE_bridge_h
#define BLE_bridge_h
// Hublib receive of antenna data from sensor BLE:
#define SENSOR_DATA_BYTES 300
extern int BLE_packet_ready;
extern int BLE_packet_overruns;
extern char sensor_data_buf[];
extern unsigned sensor_data_bytes;
#endif //BLE_bridge_h
// sdp.cpp in ObjC mobile_hub project
#include "sdp.hpp"
#include "sdp_BLE.hpp"
// Controls for receive of antenna data from Swift BLE notification data:
int BLE_packet_ready = 0;
int BLE_packet_overruns = 0;
char sensor_data_buf[ SENSOR_DATA_BYTES ];
unsigned sensor_data_bytes = 0;
. . .
// Copies the data from func peripheral(...didUpdateValueFor...) to pucBuf.
int sdpRead(SDP_Handle ftHandle, UCHAR *pucBuf, ULONG ulBufferSize, ULONG *pulBytesTransferred, DWORD dwTimeOutInMs = 1000)
{
int rv = 0;
// Await sensor antenna data packet:
// Poll buffer ready flag:
for(;;)
{
// Buffer flag?
if( BLE_packet_ready > 0 )
{
// Copy from BLE buf to hublib buffer:
memcpy( pucBuf, sensor_data_buf, sensor_data_bytes );
*pulBytesTransferred = sensor_data_bytes;
// Lower flag:
BLE_packet_ready = 0;
// return
break;
}
std::this_thread::yield();
continue;
}
return rv;
}
// mobile_sensor_API-Bridging-Header.h
// Bridging header from ObjC project that contains C++ to same ObjC project's .swift
// Use this file to import your target's public headers that you would like to expose to Swift.
//#import "sdp_BLE.hpp"
#define SENSOR_DATA_BYTES 300
extern int BLE_packet_ready ;
extern int BLE_packet_overruns ;
extern char sensor_data_buf[];
extern unsigned sensor_data_bytes ;
// mobile_sensor_API.h
// ObjC static lib project: mobile_sensor_API
// Contains .mm and .swift files
#import <Foundation/Foundation.h>
@interface Mobile_Sensor_API : NSObject
// Swift interface to data-plane within mobile_hub objC static lib project:
extern "C++" int BLE_packet_ready;
extern "C++" int BLE_packet_overruns;
extern "C++" char sensor_data_buf[];
extern "C++" unsigned sensor_data_bytes;
// mobile_BLE_central.swift
// ObjC static lib project: mobile_sensor_API
import UIKit
import CoreBluetooth
import os
@objc open
class BLE_Central: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate
{
. . .
/* Antenna Data packet received from sensor
* This callback lets us know more data has arrived via notification on the characteristic */
public func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)
{
// Buf flag still up?
if( BLE_packet_ready > 0 )
{
// Count overruns:
BLE_packet_overruns += 1;
}
else // else, Buf flag down?
{
sensor_data_bytes = UInt32(characteristic.value!.count);
let characteristicData = characteristic.value
// TODO: build error "Cannot find 'sensor_data_buf' in scope" here
characteristicData.copyBytes( to: sensor_data_buf, count: sensor_data_bytes );
//
// Raise buffer flag:
BLE_packet_ready = 1;
}
}
. . .
}
【问题讨论】:
-
是什么让你认为 Swift 参与其中?
-
非常好心地编辑了一下,让你看到他的问题更明显。该错误正在迅速发生,但可能来自 c++,因为可能未定义 sensor_data_buf。 @Doug
sensor_data_buf是通过桥接头暴露的全局变量对吗? -
奥尔森:是的。在页面上搜索它的 C++ 定义、.h 接口以及 Swift 使用的位置。
-
如果您将反对票视为社区责任,它不应该打扰您。从长远来看,其他人可能会投票。如果接口正确声明了全局,您应该检查
mobile_sensor_API.h,通过测试您是否可以从 c++ 或 c、objc 或 objc++ 端访问它 -
OlSen:感谢您的编辑!我期待在早上实施 Answer(我在加利福尼亚)
标签: c++ objective-c swift xcode core-bluetooth