Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java delphi xe5 Wifimanager和WifiInfo转换_Java_Android_Delphi Xe5 - Fatal编程技术网

Java delphi xe5 Wifimanager和WifiInfo转换

Java delphi xe5 Wifimanager和WifiInfo转换,java,android,delphi-xe5,Java,Android,Delphi Xe5,我试图隐藏wifimanager和wifiinfo(android),但我不明白为什么我有分段错误,我看到wifimanager工作得很好,但当我尝试调用wifiinfo的一些方法时,我得到了“分段错误”。我的代码: 单元wifi1; 接口 使用 System.SysUtils, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, FMX.Helpers.Android

我试图隐藏wifimanager和wifiinfo(android),但我不明白为什么我有分段错误,我看到wifimanager工作得很好,但当我尝试调用wifiinfo的一些方法时,我得到了“分段错误”。我的代码:

单元wifi1;
接口
使用
System.SysUtils,
Androidapi.JNIBridge,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
FMX.Helpers.Android;
//--------------------------------无线网络管理器---------------------------------------//
类型
JWifiManager=接口;
JWifiInfo=接口;
JWifiManagerClass=接口(JObjectClass)
['{69F35EA7-3EB9-48AA-B7FC-4FFD0E7D712F}']
功能GetACTION PICK WIFI NETWORK:JString;
功能_GetEXTRA_WIFI_INFO:JString;
函数_GetWIFI_STATE_CHANGED_ACTION:JString;
物业操作无线网络:JString读取无线网络;
属性额外无线信息:JString read\u GetEXTRA\u WIFI\u INFO;
属性WIFI\u STATE\u CHANGED\u ACTION:JString read\u GetWIFI\u STATE\u CHANGED\u ACTION;
结束;
[JavaSignature('android.net.wifi.WifiManager')]
JWifiManager=接口(JObject)
[{DA7107B9-1FAD-4A9E-AA09-8D5B84614E60}]
函数可布线:布尔值;cdecl;
函数setWifiEnabled(已启用:布尔):布尔;cdecl;
//功能getConfiguredNetworks:JList;cdecl;
函数getConnectionInfo:JWifiInfo;cdecl;
结束;
TJWifiManager=class(TJavaGenericImport)end;
//--------------------------------无线信息---------------------------------------//
JWifiInfoClass=接口(JObjectClass)
[{2B1CE79F-DE4A-40D9-BB2E-7F9F118D8C08}]
函数_GetLINK _SPEED _单位:JString;
属性链接速度单位:JString读取速度单位;
结束;
[JavaSignature('android.net.wifi.WifiInfo')]
JWifiInfo=接口(JObject)
[{4F09E865-DB04-4E64-8C81-AEFB36DABC45}]
函数getBSSID:jString;cdecl;
函数getHiddensId:布尔值;cdecl;
函数getIpAddress:整数;cdecl;
函数getLinkSpeed:整数;cdecl;
函数getMacAddress:JString;cdecl;
函数getNetworkId:integer;cdecl;
函数getRssi:integer;cdecl;
函数GetSSID:jString;cdecl;
结束;
TJWifiInfo=class(TJavaGenericImport)
结束;
实施
结束。
//-----------------------------------------------------------------------
我的测试是:

var obj:jobject;
wm:jwifimanager;
Winfo:jwifiinfo;
ip:integer;
mac:string;
jmac:JString;
begin
obj:=SharedActivity.getSystemService(TJActivity.JavaClass.WIFI_SERVICE);
wm:= Tjwifimanager.Wrap((obj as ILocalObject).GetObjectID);

Winfo:=TJWifiInfo.Create;
winfo:=wm.getconnectioninfo; <- segmentation fault
ip:=winfo.getIpAddress;
jmac:=winfo.getMacAddress;
mac:=JStringToString(jmac);
end;
var-obj:jobject;
wm:JWIFI经理;
Winfo:jwifiinfo;
ip:整数;
mac:字符串;
jmac:JString;
开始
obj:=SharedActivity.getSystemService(TJActivity.JavaClass.WIFI_服务);
wm:=Tjwifimanager.Wrap((对象作为ILocalObject.GetObjectID);
Winfo:=TJWifiInfo.Create;

winfo:=wm.getconnectioninfo 它的主要错误在于缺少对nil值的检查,这会导致分割错误(至少我认为会是这种情况——例如,wm为nil)

您可以参考中的代码片段,作为使用Android网络类的一般指南。现在这应该有帮助,而不是直接指向代码中的错误。尝试一下那个代码,并确保您了解它是如何运行的。然后,它将帮助您识别代码片段中的错误

代码的一个潜在问题是属性使用点分隔符,但是RTL Android类属性以及前面提到的代码片段使用/作为分隔符

明智地使用logcat(比如在monitor应用程序中)将有助于通过查看操作系统在该应用程序执行期间抛出的日志消息来确定是否存在这种情况

哦,还有一件事应该先检查一下——你是否在你的应用程序中添加了访问wifi状态的权限?这将导致访问wifi状态信息时出现问题,等等。

为什么使用“Winfo:=TJWifiInfo.Create;”?!。。。您不需要创建它,返回jwifiinfo实例的是getconnectioninfo函数。
为什么不简单地使用“Winfo:=wm.getconnectioninfo;”

为什么您的
JWifiManager
只有三种方法?真正的班级有20多个学生。你只允许申报你需要的吗?对我来说似乎不太可能。不,接口需要完整,以便报价正确。添加缺少的方法。另外,去掉
Winfo:=TJWifiInfo.Create行,在这种情况下它是无用的。是的,大卫,你是。你只需要申报你想进口的。不,雷米,现在不需要了。不需要添加缺少的方法。Java桥不需要它们。@blong:我不熟悉JNI桥的内部工作原理。Delphi是否使用反射/RTTI进行动态运行时查找?否则,如果不声明所有内容,它怎么能工作呢?我已经看到了这个答案,是的,我拥有所有权限,现在我已经用我想要转换的原始java代码的链接更新了我的问题。现在我正在调查以找出错误。()我还添加了logcat,但我没有发现任何奇怪的地方。我昨晚在获得所需许可的情况下尝试了该代码——我获得了手机的MAC地址,并将其显示在对话框中。我认为权限是最后一个问题,考虑到我对你的代码的成功。我上传了我的测试项目,我已经检查了权限,但仍然存在访问冲突的相同错误。重新分隔符,你能告诉我什么是不清楚的吗“代码的一个潜在问题是属性使用了点分隔符,但是RTL Android类属性以及前面提到的代码片段使用了/作为分隔符。”我会看看是否可以更清楚地解释。
var obj:jobject;
wm:jwifimanager;
Winfo:jwifiinfo;
ip:integer;
mac:string;
jmac:JString;
begin
obj:=SharedActivity.getSystemService(TJActivity.JavaClass.WIFI_SERVICE);
wm:= Tjwifimanager.Wrap((obj as ILocalObject).GetObjectID);

Winfo:=TJWifiInfo.Create;
winfo:=wm.getconnectioninfo; <- segmentation fault
ip:=winfo.getIpAddress;
jmac:=winfo.getMacAddress;
mac:=JStringToString(jmac);
end;