Hello

I am trying to use JNI from my Android Qt C++ app so that I can access the Android Bluetooth functionality via a simple Java class that I wrote.

While I am able to successfully use FindClass() to get the standard Android and Java classes (e.g. android/bluetooth/BluetoothDevice, java/lang/String, etc...), I cannot seem to get it to find my Java class.

Does anybody out there have any idea what I’m doing wrong?

Any help would be greatly appreciated
Thank you
Scott



Here is some simple test code that demonstrates my problem:

I place my Java test class in the same source folder and package (i.e. <proj>/android/src/org/qtproject/qt5/android/bindings ) as QtApplication.java and QtActivity.java. It appears to be properly compiled, dex’ed, and placed in the package before being sent up to the device to be executed.

Qt Code:
  1. //****************** Here is my Java class that I want to talk to from my Qt app: *********************
  2. package org.qtproject.qt5.android.bindings;
  3.  
  4. public class JniTest
  5. {
  6. public int GetNum( )
  7. {
  8. return 5;
  9. }
  10. }
  11. //*****************************************************************************************************
  12.  
  13. //***************** Here is my C++ code that attempts to find my Java class **********************
  14. #include <jni.h>
  15. #include <android/log.h>
  16. #include <QtGlobal>
  17.  
  18. #define dbprintf(...) __android_log_print(ANDROID_LOG_VERBOSE, "JniTest", __VA_ARGS__)
  19.  
  20. JavaVM *vm = NULL;
  21. JNIEnv *env = NULL;
  22.  
  23. //*******************************
  24. jint JNI_OnLoad(JavaVM *vmIn, void *reserved)
  25. {
  26. dbprintf( "JNI_OnLoad: enter" );
  27. vm = vmIn;
  28. return JNI_VERSION_1_6;
  29. }
  30.  
  31. //*******************************
  32. void JniTest( )
  33. {
  34. qDebug( "JniTest enter: jvm=%08x", (int)vm );
  35. if( !vm )
  36. return;
  37.  
  38. JavaVMAttachArgs args = { JNI_VERSION_1_6, NULL, NULL };
  39. vm->AttachCurrentThread( &env, &args );
  40.  
  41. qDebug( "JniTest enter: env=%08x", (int)env );
  42. if( !env )
  43. return;
  44.  
  45. // Getting a standard Java class succeeds
  46. CreateClass( "java/lang/String" );
  47.  
  48. // Getting my Java class fails
  49. CreateClass( "org/qtproject/qt5/android/bindings/JniTest" );
  50.  
  51. // Getting known Qt java classes also fail
  52. CreateClass( "org/qtproject/qt5/android/QtNative" );
  53. CreateClass( "org/qtproject/qt5/android/bindings/QtActivity" );
  54. }
  55.  
  56. //*******************************
  57. jclass CreateClass( const char *name )
  58. {
  59. jclass cls = env->FindClass( name );
  60. jclass gcls = NULL; //cls ? (jclass)env->NewGlobalRef( cls ) : NULL;
  61. qDebug( "JniTest CreateClass: name=%s, cls=%08x gcls=%08x", name, (int)cls, (int)gcls );
  62. return gcls;
  63. }
  64.  
  65. //*****************************************************************************************************
To copy to clipboard, switch view to plain text mode 
//*********************** Here is the resulting output from my test code ******************************
I/Qt ( 5276): qt start
D/dalvikvm( 5276): Trying to load lib /data/app-lib/com.pasco.QtAndroidJniTest-1/libQtAndroidJniTest.so 0x42094680
D/dalvikvm( 5276): Added shared lib /data/app-lib/com.pasco.QtAndroidJniTest-1/libQtAndroidJniTest.so 0x42094680
V/JniTest ( 5276): JNI_OnLoad: enter
W/Qt ( 5276): ..\src\androidjnimain.cpp:449 (jboolean startQtApplication(JNIEnv*, jobject, jstring, jstring)): Can't set environment ""
W/Qt ( 5276): kernel\qcoreapplication.cpp:412 (QCoreApplicationPrivate::QCoreApplicationPrivate( int&, char**, uint)): WARNING: QApplication was not created in the main() thread.
W/dalvikvm( 5276): dvmFindClassByName rejecting 'org/qtproject/qt5/android/QtNativeInputConnection'
W/dalvikvm( 5276): dvmFindClassByName rejecting 'org/qtproject/qt5/android/QtExtractedText'
D/Qt ( 5276): ..\QtAndroidJniTest\mainwindow.cpp:60 (void JniTest()): JniTest enter: jvm=41aa40c0
D/Qt ( 5276): ..\QtAndroidJniTest\mainwindow.cpp:67 (void JniTest()): JniTest enter: env=5bbba0e0
D/Qt ( 5276): ..\QtAndroidJniTest\mainwindow.cpp:53 (_jclass* CreateClass(const char*)): JniTest CreateClass: name=java/lang/String, cls=1d200001 gcls=00000000
D/Qt ( 5276): ..\QtAndroidJniTest\mainwindow.cpp:53 (_jclass* CreateClass(const char*)): JniTest CreateClass: name=org/qtproject/qt5/android/bindings/JniTest, cls=00000000 gcls=00000000
D/Qt ( 5276): ..\QtAndroidJniTest\mainwindow.cpp:53 (_jclass* CreateClass(const char*)): JniTest CreateClass: name=org/qtproject/qt5/android/QtNative, cls=00000000 gcls=00000000
D/Qt ( 5276): ..\QtAndroidJniTest\mainwindow.cpp:53 (_jclass* CreateClass(const char*)): JniTest CreateClass: name=org/qtproject/qt5/android/bindings/QtActivity, cls=00000000 gcls=00000000
//************************************************** ************************************************** *