无法将 DefineClass (JNI) 与 Qt 资源一起使用
Failing to use DefineClass (JNI) with a Qt Resource
我正在尝试使用 DefineClass,它是 Java Native Interface 的一部分。
该方法采用 const jbyte*
,它是 const signed char*
并且我正在尝试从 Qt 资源中解析它。但是肯定有问题,因为 ExceptionDescribe()
打印 java.lang.ClassFormatError: Truncated class file.
QFile qfile(":/SomeClass.class");
qfile.open(QFile::ReadOnly)
QByteArray qbytes = qfile.readAll();
char *test = qbytes.data();
jbyte *buf = reinterpret_cast<jbyte*>(test);
jclass processorCls = env->DefineClass("example/SomeClass", nullptr, buf, sizeof(buf));
if (env->ExceptionCheck())
{
env->ExceptionDescribe();
env->ExceptionClear();
}
我可以验证该资源是否有效,因为我能够使用找到的方法打印 qfile
的内容 here。
void read(QString fName)
{
QFile file(fName);
if (!file.open(QFile::ReadOnly | QFile::Text))
{
std::cout << "Could not open the file for reading" << std::endl;
return;
}
QTextStream in(&file);
QString text = in.readAll();
std::cout << text << std::endl;
file.close();
}
sizeof(buf)
returns指针的大小,不是缓冲区的大小。请改用 qbytes.size()
。
我正在尝试使用 DefineClass,它是 Java Native Interface 的一部分。
该方法采用 const jbyte*
,它是 const signed char*
并且我正在尝试从 Qt 资源中解析它。但是肯定有问题,因为 ExceptionDescribe()
打印 java.lang.ClassFormatError: Truncated class file.
QFile qfile(":/SomeClass.class");
qfile.open(QFile::ReadOnly)
QByteArray qbytes = qfile.readAll();
char *test = qbytes.data();
jbyte *buf = reinterpret_cast<jbyte*>(test);
jclass processorCls = env->DefineClass("example/SomeClass", nullptr, buf, sizeof(buf));
if (env->ExceptionCheck())
{
env->ExceptionDescribe();
env->ExceptionClear();
}
我可以验证该资源是否有效,因为我能够使用找到的方法打印 qfile
的内容 here。
void read(QString fName)
{
QFile file(fName);
if (!file.open(QFile::ReadOnly | QFile::Text))
{
std::cout << "Could not open the file for reading" << std::endl;
return;
}
QTextStream in(&file);
QString text = in.readAll();
std::cout << text << std::endl;
file.close();
}
sizeof(buf)
returns指针的大小,不是缓冲区的大小。请改用 qbytes.size()
。