I'm not familiar with that, jbteArray, but in attemping your challenge, I saw:
 
qjniEnv->SetByteArrayRegion(jdata, 0, _size, reinterpret_cast<jbyte *>(foo));
 
but saw this in the docs: 
void Set<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array, jsize start, jsize len, NativeType *buf);
 
is jdata your jni env?
Sent: Friday, January 25, 2019 at 1:13 PM
From: "René Hansen" <ren...@gmail.com>
To: interest <interest@qt-project.org>
Subject: [Interest] (JNI ERROR) jbytearray -> java.lang.String[] - What am I doing wrong here?
All I want to do is send some bytes from Qt to Java, but I'm running into an annoying problem, where my jbyteArray gets turned into java.lang.String[] in mid-flight:
 
E art     : JNI ERROR (app bug): attempt to pass an instance of java.lang.String[] as argument 1 to int Foo.bar(byte[])
F art     : art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: bad arguments passed to int Foo.bar(byte[]) (see above for details)
F art     : art/runtime/java_vm_ext.cc:410]     from void org.qtproject.qt5.android.QtNative.runPendingCppRunnables()
F art     : art/runtime/java_vm_ext.cc:410] "main" prio=5 tid=1 Runnable
...
 
Here's a minimal example; just a simple auto test project:
 
TestJNI.pro:
 
QT += testlib androidextras
QT -= gui
 
CONFIG += qt console warn_on depend_includepath testcase
CONFIG -= app_bundle
 
TEMPLATE = app
 
SOURCES +=  tst_test_jni.cpp
 
ANDROID_PACKAGE_SOURCE_DIR = $$PWD
 
DISTFILES += \
    src/Foo.java
 
tst_test_jni.cpp:
 
#include <QtTest>
#include <QAndroidJniEnvironment>
#include <QtAndroid>
 
class test_jni : public QObject
{
    Q_OBJECT
 
private slots:
    void test_case1();
};
 
void test_jni::test_case1()
{
  QAndroidJniEnvironment qjniEnv;
  jsize _size = static_cast<jsize>(5);
  jbyteArray jdata = qjniEnv->NewByteArray(_size);
  jint result;
 
  if (jdata == nullptr)
    QFAIL("Failed creating new jbyteArray");
 
  if (qjniEnv->GetArrayLength(jdata) != _size)
  {
    qjniEnv->DeleteLocalRef(jdata);
    QFAIL("Failed to allocate entire array through JNI");
  }
 
  // Lorem
  char foo[] = { 0x4c, 0x6f, 0x72 ,0x65, 0x6d };
 
  qjniEnv->SetByteArrayRegion(jdata, 0, _size, reinterpret_cast<jbyte *>(foo));
 
  QtAndroid::runOnAndroidThread([jdata] {
    QAndroidJniObject::callStaticMethod<jint>(
          "Foo",
          "bar",
          "([B)I",
          jdata);
  });
 
  QCOMPARE(result, 42);
}
 
QTEST_APPLESS_MAIN(test_jni)
 
#include "tst_test_jni.moc"
 
Foo.java:
 
public class Foo {
  static int bar(byte baz[]) {
      return 42;
  }
}
 
Have I missed something very basic here?
 
 
Best regards,
 
René Hansen
_______________________________________________ Interest mailing list Interest@qt-project.org https://lists.qt-project.org/listinfo/interest
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to