KNI接口 "KNI_GetFieldID" 调用失败问题的解决
2012-12-07 13:51
477 查看
KNI接口 "KNI_GetFieldID" 调用失败问题的解决
每次调用KNI_GetFieldID总是返回0,也就是在函数_KNI_field_lookup_helper()中执行到如下代码片段:
if (!field.is_valid() || (field.is_static() != is_static) ||
// We do not support field IDs in super classes:
(field.is_static() && !holder().equals(&ic))) {
return (jfieldID)0;
然而在 kni.h 中有这么一段注释:
/**
* Instance field access.
*
* Note specific to this VM: KNI_GetFieldID() must not be applied
* on a class whose
* fields have been renamed by the romizer. You need to use
* the DontRenameNonPublicFields flag in your romizer configuration
* file. See src/vm/cldc_rom.cfg in this VM source distribution
* for an example.
*/
KNIEXPORT jfieldID KNI_GetFieldID(jclass classHandle, const char* name,
const char* signature);
也就是说 class 的 fields 会被 romizer 改名,而KNI_GetFieldID对改名后的 fields 会获取失败;
为避免 fields 被改名,需要在cldc/src/vm/cldc_rom.cfg 中使用DontRenameNonPublicFields,如下:
# Do not rename the non-public fields/methods of the following classes,
# because these fields are accessed by name in KNI code.
DontRenameNonPublicFields = com.eastcom.eui.entity.Contact
DontRenameNonPublicFields = com.sun.cldc.io.ResourceInputStream
If CLDC_11
DontRenameNonPublicFields = java.lang.ref.WeakReference
EndIf
#Some symbols are referenced during bootstrap to verify the class
If ISOLATES
DontRenameNonPublicFields = com.sun.cldc.isolate.Isolate
DontRenameNonPublicMethods = com.sun.cldc.isolate.Isolate
EndIf
修改后验证,KNI_GetFieldID 获取成功。
结论就是KNI对应的JAVA上层实体类的成员一般最好定义成public的,如果是private,
需要修改cldc/src/vm/cldc_rom.cfg文件。
PS: 从字面上理解DontRenameNonPublicFields,private域会被修改,而public域是否不会被改名呢?
KNI_GetFieldID 对 public域是否能总是获取成功?此猜想待验证(不会改名)
每次调用KNI_GetFieldID总是返回0,也就是在函数_KNI_field_lookup_helper()中执行到如下代码片段:
if (!field.is_valid() || (field.is_static() != is_static) ||
// We do not support field IDs in super classes:
(field.is_static() && !holder().equals(&ic))) {
return (jfieldID)0;
然而在 kni.h 中有这么一段注释:
/**
* Instance field access.
*
* Note specific to this VM: KNI_GetFieldID() must not be applied
* on a class whose
* fields have been renamed by the romizer. You need to use
* the DontRenameNonPublicFields flag in your romizer configuration
* file. See src/vm/cldc_rom.cfg in this VM source distribution
* for an example.
*/
KNIEXPORT jfieldID KNI_GetFieldID(jclass classHandle, const char* name,
const char* signature);
也就是说 class 的 fields 会被 romizer 改名,而KNI_GetFieldID对改名后的 fields 会获取失败;
为避免 fields 被改名,需要在cldc/src/vm/cldc_rom.cfg 中使用DontRenameNonPublicFields,如下:
# Do not rename the non-public fields/methods of the following classes,
# because these fields are accessed by name in KNI code.
DontRenameNonPublicFields = com.eastcom.eui.entity.Contact
DontRenameNonPublicFields = com.sun.cldc.io.ResourceInputStream
If CLDC_11
DontRenameNonPublicFields = java.lang.ref.WeakReference
EndIf
#Some symbols are referenced during bootstrap to verify the class
If ISOLATES
DontRenameNonPublicFields = com.sun.cldc.isolate.Isolate
DontRenameNonPublicMethods = com.sun.cldc.isolate.Isolate
EndIf
修改后验证,KNI_GetFieldID 获取成功。
结论就是KNI对应的JAVA上层实体类的成员一般最好定义成public的,如果是private,
需要修改cldc/src/vm/cldc_rom.cfg文件。
PS: 从字面上理解DontRenameNonPublicFields,private域会被修改,而public域是否不会被改名呢?
KNI_GetFieldID 对 public域是否能总是获取成功?此猜想待验证(不会改名)
相关文章推荐
- 解决方法:SQL2008 链接服务器 访问接口 "SQLNCLI10" 的架构行集 出错的问题!
- 对"对DllRegisterServer的调用失败,错误代码为0x8007005"的解决办法
- vs2005调用vp2.2出现"应用程序正常初始化(0xc0150002)失败“的解决方法
- dojo解决这个问题Tried to register widget with id=="myid" but that id is already registered
- dsoframer 注册控件后在某些机器调用部分函数时提示"没有注册接口"的解决办法
- 对"对DllRegisterServer的调用失败,错误代码为0x8007005"的解决办法
- " LINK :fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏"问题的最终解决办法
- 如何解决MS串口通信控件MSCOMM32.OCX "建立空文档失败" 的问题?
- C++ CreateInstance("ADODB.Connection");创建接口失败的解决方法
- "无法连接到服务器,用户xxx登陆失败" 解决问题
- QT工程看不到头文件和源文件qmake失败stat(".")failed问题解决
- ARM开发板上iconv_open("utf-8", "gb2312") 调用失败的解决方法
- AXIS的"dotnet_soapenc_bugfix"属性会自动重设的bug,将导致c++客户端调用soap接口失败
- ARM开发板上iconv_open("utf-8", "gb2312") 调用失败的解决方法
- 数据库连接,有时会出错在conn.open connstr这地方的问题,及联接查询调用rs("user.id")的问题2006-6-8-4
- Foxmail接收邮件时,报出"网络操作失败","POP3:****"问题的解决办法
- 解决方法:SQL2008 链接服务器 访问接口 "SQLNCLI10" 的架构行集 出错的问题!
- "LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏"的问题的解决
- Hibernate 级联保存时 偶尔会出现 "id to load is required for loading" 问题的解决办法
- 巧妙解决问题:&CMFCcodeDlg::RunCommands”创建指向成员的指针。MFC多线程调用要求调用的接口必须是全局函数或静态成员函数