JAVAlang.NoSuchFieldError:类“Ljava/lang/Integer”中没有“I”字段“value”或者它的超类Android 10
我收到了一封信。所以我必须将客户端的安卓库集成到我的Xamarin表单项目中。该库帮助应用程序连接到物联网设备。由于库方法具有以下特征,我决定编写一个java包装器来简化参数并创建一个aar文件。之后,我以本机方式绑定aar,并将其用作项目中的dll
需要注意的是,Xamarin中的问题仅在编译目标为>;10.否则,它可以正常工作。我的猜测是latest Updates to non-SDK interfaces broke the application
库标题:
public static native int ReadParams(String token, StringBuilder serial, StringBuilder ssid, StringBuilder password, StringBuilder sensor, Integer keepAlive);
问题是: 当从本机安卓应用程序中调用该方法时,该方法工作正常,但是由于Xamarin表单中的以下错误而崩溃。崩溃在Java包装器的下面一行
紧急救援线:
StringBuilder strSerial = new StringBuilder();
StringBuilder strssid = new StringBuilder();
StringBuilder strpassword = new StringBuilder();
StringBuilder strsensor = new StringBuilder();
Integer keepAlive = new Integer(0);
//Crash on below line
int response = EPM002Lib.ReadParams(token, strSerial, strssid, strpassword, strsensor, keepAlive);
堆栈跟踪:
--- End of managed Java.Lang.IncompatibleClassChangeError stack trace --- java.lang.NoSuchFieldError: no "I" field "value" in class "Ljava/lang/Integer;" or its superclasses at com.esong.lib.EPM002Lib.ReadParams(Native Method) at com.sensorwa.config.configdemo.SquareSdkhelper.ReadParams(SquareSdkhelper.java:32)
我了解更多关于EPM002Lib内部功能的信息。ReadParams-params会有所帮助,但是,该库似乎可以与本机安卓应用程序一起使用(即使是在针对安卓 10编译时)。请随时询问更多信息或提供建议。谢谢你的帮助😄
# 1 楼答案
您依赖的是一个不应该依赖的实现细节
现在它坏了,你可以保留这两部分
# 2 楼答案
我使用Android Aarch64编译器编译了此文件:
这将为
access_field
生成以下代码:对于
access_method
而言:主要区别在于
ldr x8
调用中使用的偏移量。这些是JNIEnv
中函数指针表的偏移量,更具体地说:GetFieldID
位于偏移量752处GetIntField
位于偏移量800处GetMethodID
位于偏移量264处CallIntMethod
位于偏移量392处李>另一个区别是传递给
GetIntField
或GetMethodID
的签名,该签名在链接器时被注入。我转储的对象文件尚未链接,因此那里有伪指令。它是第四个参数,因此在寄存器x3
中传递因此,总而言之,您需要执行以下操作:
"()I"
的地址或将其添加到字符串表中李>java.lang.Integer#value
的所有位置李>ldr x8
调用前blr x8
中的两个函数指针偏移量(752->;264;800->;392)李>x3
的代码,并将其改为指向"()I"
李>祝你好运