Crash when using Bluetooth
Lauri Laanmets
lauri.laanmets at proekspert.ee
Thu Nov 8 11:52:01 UTC 2012
Hi
I'm quite sure you are on the right track. I remember I used to do quite
a lot of things in "JNI_OnLoad " because only in that case it was
possible to access the Necessitas Java classes. I remember an e-mail
about redesigning that part, to be able to access Necessitas Java
classes also from other threads. I would suspect something has changed
in this field. I started working on it but since my "/local/data" is
inaccessible, I kind of a "lost a little motivation".
Can anybody comment, are Necessitas Java classes now available also in
the other threads?
Lauri
On 8.11.2012 13:39, Kate Alhola wrote:
> Hi, I have been doing little bit research about this issue. I just
> under investigation one simple function QBluetoothLocaldevice::name().
> The function crashes if vm->GetEnv() is done in JINI_OnLoad() . When I
> moved that code inside of QBluetoothLocaldevice constructor
> code works. I have not yet made any patches, this was just result of
> simple experiment.
>
> I tried in some other code do same allocations in JINI_OnLoad and got
> errors that VM was allocated for wrong thread.
> It looks that JINI_OnLoad is too early phase to allocate
>
> Before going forward with fix, I just like hear opinion am I at right
> track. The bthost is my experimental class
> just to test code. initJini is called from constructor. Name()
> duplicates function from QBluetoothLocalDevice
>
> Then other related question, if I do patched libQtConnectivity, what
> is best way to use it ? Necessitas always
> installs it's own and it can't be copied over without rooting the device.
>
>
> Kate
>
> void BtHost::initJini()
> {
> void* venv = NULL;
>
> qDebug() << "BtHost:JNI_OnLoad()";
> if (m_jvm->GetEnv(&venv, JNI_VERSION_1_4) != JNI_OK)
> {
> qDebug() << "Qt:GetEnv failed";
> return;
> }
> jclass qtApplicationC;
> env = reinterpret_cast<JNIEnv*>(venv);
> btAdapterClass = env->FindClass("android/bluetooth/BluetoothAdapter");
> if (btAdapterClass == NULL)
> {
> qDebug() << "Qt:Native registration unable to find class
> android/bluetooth/BluetoothAdapter";
> }
>
> jmethodID getDefaultAdapterID
> =env->GetStaticMethodID(btAdapterClass, "getDefaultAdapter",
> "()Landroid/bluetooth/BluetoothAdapter;");
> if(getDefaultAdapterID == NULL){
> qDebug() << "Qt:Native registration unable to get method ID:
> getDefaultAdapter of android/bluetooth/BluetoothAdapter";
> }
>
> btAdapterObject = env->CallStaticObjectMethod(btAdapterClass,
> getDefaultAdapterID);
> if(btAdapterObject == NULL){
> qDebug() << "Qt:Device does not support Bluetooth";
> }
> btAdapterObject = env->NewGlobalRef(btAdapterObject);
> }
>
> QString BtHost::name() const
> {
> qDebug() << " BtHost::name()";
> static jmethodID getNameID = env->GetMethodID(btAdapterClass,
> "getName", "()Ljava/lang/String;");
> qDebug() << " QBluetoothLocalDevice::name() env->GetMethodID";
> jstring peerName = (jstring)
> env->CallObjectMethod(btAdapterObject, getNameID);
> qDebug() << " QBluetoothLocalDevice::name()
> env->CallObjectMethod";
> jboolean isCopy;
> const jchar* name = env->GetStringChars(peerName, &isCopy);
> QString qtName = QString::fromUtf16(name,
> env->GetStringLength(peerName));
> qDebug() << " QBluetoothLocalDevice::name() name=" << qtName;
> env->ReleaseStringChars(peerName, name);
> qDebug() <<" QBluetoothLocalDevice::name() exit";
> return qtName;
>
>
> }
>
>
>
>
> On Thu, Nov 1, 2012 at 7:29 PM, Kate Alhola <kate.alhola at gmail.com
> <mailto:kate.alhola at gmail.com>> wrote:
>
> On Mon, Oct 29, 2012 at 10:59 PM, Micke Prag
> <micke.prag at telldus.se <mailto:micke.prag at telldus.se>> wrote:
>
> Hi,
>
> It only happens after I call start(). Only creating the object
> works fine.
> Thank you for looking into this.
>
>
> I noticed that exactly same thing happens with QBluetoothSocket
> and QBluetoothLocalDevice, in both cases they happen If I try use
> some member functions. Creation of object goes OK in both of
> cases. I posted report to android-qt list but may be this is
> better forum.
>
> Here is two cases where I got same bug
>
> Code:
> qDebug() << "Turning bluetooth on";
> localDevice->powerOn();
>
> D/Qt ( 4746): Turning bluetooth on
>
> E/dalvikvm( 4746): JNI ERROR (app bug): accessed stale local
> reference 0x9f50001d (index 7 in a table of size 4)
>
> E/dalvikvm( 4746): VM aborting
>
>
> Or
>
> from:
> wmSocket = new QBluetoothSocket(
> QBluetoothSocket::RfcommSocket);
>
> qDebug() << "btHost::tryConnect()" <<
> wmPulse.address().toString() << ":" << PORT;
> wmSocket->connectToService(wmPulse.address(), PORT);
>
> D/Qt ( 6195): btHost::tryConnect() "83:7C:82:00:39:31" : 5
>
> E/dalvikvm( 6195): JNI ERROR (app bug): accessed stale local
> reference 0xb3b0001d (index 7 in a table of size 0)
>
> E/dalvikvm( 6195): VM aborting
>
>
> Kate
>
>
>
> Regards
> Micke
>
> On Monday 29 October 2012 at 21:54, Lauri Laanmets wrote:
>
>> Hi
>>
>> I guess that is addressed to me :). Crash is definitely a
>> bug, regardless of Android permissions or missing Java files.
>> Can you verify if it crashes on creating the DiscoveryAgent
>> object or when starting the discovery?
>>
>> I have lost my old devel set-up, It takes me a few days to
>> get on that issue.
>>
>> Regards
>> Lauri
>>
>>
>> On 29.10.2012 22:31, Micke Prag wrote:
>>> Hello,
>>>
>>> I know that the Bluetooth support in Necessitas is not
>>> complete but I wanted to try it out anyway. I am only trying
>>> to discover bluetooth devices but my application crashes. I
>>> don't know if I am doing something wrong or if it is not
>>> supported yet?
>>>
>>> The output from logcat can be found here:
>>> http://pastebin.com/khcj28Xy
>>> This is what I am doing:
>>> QtMobility::QBluetoothDeviceDiscoveryAgent agent;
>>> agent.start();
>>>
>>> libs.xml:
>>> <?xml version='1.0' encoding='utf-8'?>
>>> <resources>
>>> <array name="qt_libs">
>>> <item>QtCore</item>
>>> <item>QtGui</item>
>>> <item>QtNetwork</item>
>>> <item>QtDeclarative</item>
>>> <item>QtXml</item>
>>> <item>QtOpenGL</item>
>>> <item>QtSystemInfo</item>
>>> <item>QtConnectivity</item>
>>> </array>
>>> <array name="bundled_libs"/>
>>> </resources>
>>>
>>> I also have this in AndroidManifest.xml:
>>> <uses-permission android:name="android.permission.BLUETOOTH" />
>>>
>>> Bluetooth is activated on the device.
>>>
>>> The device is a Cube U30GT-H running Android 4.1.1
>>>
>>> --
>>> Micke Prag
>>>
>>>
>>> _______________________________________________
>>> Necessitas-devel mailing list
>>> Necessitas-devel at kde.org <mailto:Necessitas-devel at kde.org>
>>> https://mail.kde.org/mailman/listinfo/necessitas-devel
>>
>
>
> _______________________________________________
> Necessitas-devel mailing list
> Necessitas-devel at kde.org <mailto:Necessitas-devel at kde.org>
> https://mail.kde.org/mailman/listinfo/necessitas-devel
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/necessitas-devel/attachments/20121108/23fece56/attachment-0001.html>
More information about the Necessitas-devel
mailing list