Create WifiConfiguration with Delphi XE5 for Andro

2019-07-17 19:12发布

问题:

I'm trying to create a WifiConfiguration for Android. All other properties can be set. But if i try to set the SSID or BSSID, i'm getting a segmentation fault (11) and the app and Delphi just hangs.

var
  WIFIConfig: JWifiConfiguration;
begin
  WIFIConfig :=  TJWifiConfiguration.JavaClass.init; 
  WIFIConfig.hiddenSSID := false;                         -> works
  WIFIConfig.SSID := StringtoJString('"YOUR_WLAN_SSID"'); -> App just hangs
end;

http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html

   JWifiConfigurationClass = interface(JObjectClass)
    ['{F69F53BC-BC63-436A-8DA9-57389B30CAA8}']
    function init: JWifiConfiguration; cdecl; overload;

  end;

  [JavaSignature('android/net/wifi/WifiConfiguration')]
  JWifiConfiguration = interface(JObject)
    ['{382E85F2-6BF8-4255-BA3C-03C696BC6451}']
    function _GetSSID: JString;
    procedure _SetSSID(Value: JString);
    function _GetBSSID: JString;
    procedure _SetBSSID(Value: JString);
    function _GethiddenSSID: boolean;
    procedure _SethiddenSSID(Value: boolean);
    function _GetallowedAuthAlgorithms: JBitSet;
    procedure _SetallowedAuthAlgorithms(Value: JBitSet);
    function _GetallowedGroupCiphers: JBitSet;
    procedure _SetallowedGroupCiphers(Value: JBitSet);
    function _GetallowedKeyManagement: JBitSet;
    procedure _SetallowedKeyManagement(Value: JBitSet);
    function _GetallowedPairwiseCiphers: JBitSet;
    procedure _SetallowedPairwiseCiphers(Value: JBitSet);
    function _GetallowedProtocols: JBitSet;
    procedure _SetallowedProtocols(Value: JBitSet);
    function _GetnetworkId: integer;
    procedure _SetnetworkId(Value: integer);
    function _GetpreSharedKey: JString;
    procedure _SetpreSharedKey(Value: JString);
    function _Getstatus: integer;
    procedure _Setstatus(Value: integer);
    function _GetwepTxKeyIndex: integer;
    procedure _SetwepTxKeyIndex(Value: integer);
    function _GetwepKeys: TJavaObjectArray<JString>;
    procedure _SetwepKeys(Value: TJavaObjectArray<JString>);

    property SSID: JString read _GetSSID write _SetSSID;
    property BSSID: JString read _GetBSSID write _SetBSSID;
    property allowedAuthAlgorithms: JBitSet read _GetallowedAuthAlgorithms write _SetallowedAuthAlgorithms;
    property allowedGroupCiphers: JBitSet read _GetallowedGroupCiphers write _SetallowedGroupCiphers;
    property allowedKeyManagement: JBitSet read _GetallowedKeyManagement write _SetallowedKeyManagement;
    property allowedPairwiseCiphers: JBitSet read _GetallowedPairwiseCiphers write _SetallowedPairwiseCiphers;
    property allowedProtocols: JBitSet read _GetallowedProtocols write _SetallowedProtocols;
    property hiddenSSID: boolean read _GethiddenSSID write _SethiddenSSID;
    property networkId: integer read _GetnetworkId write _SetnetworkId;
    property preSharedKey: JString read _GetpreSharedKey write _SetpreSharedKey;
    property priority: integer read _GetnetworkId write _SetnetworkId;
    property status: integer read _Getstatus write _Setstatus;
    property wepKeys: TJavaObjectArray<JString> read _GetwepKeys write _SetwepKeys;
    property wepTxKeyIndex: integer read _GetwepTxKeyIndex write _SetwepTxKeyIndex;

  end;

  TJWifiConfiguration = class(TJavaGenericImport<JWifiConfigurationClass,
    JWifiConfiguration>)
  end;

回答1:

You're missing the cdecl calling convention on all of your JWifiConfiguration methods.

[JavaSignature('android/net/wifi/WifiConfiguration')]
JWifiConfiguration = interface(JObject)
  ['{382E85F2-6BF8-4255-BA3C-03C696BC6451}']
  function _GetSSID: JString; cdecl;
  procedure _SetSSID(Value: JString); cdecl;
  function _GetBSSID: JString; cdecl;
  procedure _SetBSSID(Value: JString); cdecl;
  function _GethiddenSSID: boolean; cdecl;
  procedure _SethiddenSSID(Value: boolean); cdecl;
  function _GetallowedAuthAlgorithms: JBitSet; cdecl;
  procedure _SetallowedAuthAlgorithms(Value: JBitSet); cdecl;
  function _GetallowedGroupCiphers: JBitSet; cdecl;
  procedure _SetallowedGroupCiphers(Value: JBitSet); cdecl;
  function _GetallowedKeyManagement: JBitSet; cdecl;
  procedure _SetallowedKeyManagement(Value: JBitSet); cdecl;
  function _GetallowedPairwiseCiphers: JBitSet; cdecl;
  procedure _SetallowedPairwiseCiphers(Value: JBitSet); cdecl;
  function _GetallowedProtocols: JBitSet; cdecl;
  procedure _SetallowedProtocols(Value: JBitSet); cdecl;
  function _GetnetworkId: integer; cdecl;
  procedure _SetnetworkId(Value: integer); cdecl;
  function _GetpreSharedKey: JString; cdecl;
  procedure _SetpreSharedKey(Value: JString); cdecl;
  function _Getstatus: integer; cdecl;
  procedure _Setstatus(Value: integer); cdecl;
  function _GetwepTxKeyIndex: integer; cdecl;
  procedure _SetwepTxKeyIndex(Value: integer); cdecl;
  function _GetwepKeys: TJavaObjectArray<JString>; cdecl;
  procedure _SetwepKeys(Value: TJavaObjectArray<JString>); cdecl;

  property SSID: JString read _GetSSID write _SetSSID;
  property BSSID: JString read _GetBSSID write _SetBSSID;
  property allowedAuthAlgorithms: JBitSet read _GetallowedAuthAlgorithms write _SetallowedAuthAlgorithms;
  property allowedGroupCiphers: JBitSet read _GetallowedGroupCiphers write _SetallowedGroupCiphers;
  property allowedKeyManagement: JBitSet read _GetallowedKeyManagement write _SetallowedKeyManagement;
  property allowedPairwiseCiphers: JBitSet read _GetallowedPairwiseCiphers write _SetallowedPairwiseCiphers;
  property allowedProtocols: JBitSet read _GetallowedProtocols write _SetallowedProtocols;
  property hiddenSSID: boolean read _GethiddenSSID write _SethiddenSSID;
  property networkId: integer read _GetnetworkId write _SetnetworkId;
  property preSharedKey: JString read _GetpreSharedKey write _SetpreSharedKey;
  property priority: integer read _GetnetworkId write _SetnetworkId;
  property status: integer read _Getstatus write _Setstatus;
  property wepKeys: TJavaObjectArray<JString> read _GetwepKeys write _SetwepKeys;
  property wepTxKeyIndex: integer read _GetwepTxKeyIndex write _SetwepTxKeyIndex;
end;