I am trying to write an Android phone app that inserts data from my phone via JDBC into a SAP HANA instance (no HCP, it is a physical one). I am developing the Android app via AndroidStudio. I am totally new to Android app development and SAP HANA.
I read Connect to SAP HANA via JDBC - SAP HANA Developer Guide for SAP HANA Studio - SAP Library but I think I fail at step two: "2. Add ngdbc.jar to your classpath."
I imported the ngdbc.jar file from my HANA studio folder into my AndroidStudio project by trying two methods. I first added the ngdbc.jar to the project's libs folder and clicked "add to library". This did not solve the problem. I was no longer able to compile the project. Then I tried to import the ngdbc.jar as a .jar module. I also checked if the modul dependency existed to that module under Module Settings -> Modules "app" -> Dependencies. It did exist. That was my understanding of "2. Add ngdbc.jar to your classpath.".
However, if I run the app on my Android phone (Moto G, Android Version 5.0.2) or on the emulator (Nexus 5, Android Version 5.1) I receive following error:
08-2015:34:17.306 21714-22168/com.iot.fb.sensor W/System.err﹕ java.lang.ClassNotFoundException: com.sap.db.jdbc.Driver
08-2015:34:17.329 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.Class.classForName(NativeMethod)
08-2015:34:17.329 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.Class.forName(Class.java:308)
08-2015:34:17.329 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.Class.forName(Class.java:272)
08-2015:34:17.329 21714-22168/com.iot.fb.sensor W/System.err﹕ at com.iot.fb.sensor.MainActivity.insert(MainActivity.java:84)
08-2015:34:17.329 21714-22168/com.iot.fb.sensor W/System.err﹕ at com.iot.fb.sensor.MainActivity$1.run(MainActivity.java:68)
08-2015:34:17.329 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
08-2015:34:17.329 21714-22168/com.iot.fb.sensor W/System.err﹕Causedby: java.lang.ClassNotFoundException:Didn't find class "com.sap.db.jdbc.Driver" on path: DexPathList[[zip file "/data/app/com.iot.fb.sensor-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
08-20 15:34:17.329 21714-22168/com.iot.fb.sensor W/System.err﹕ at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ ... 6 more
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ Suppressed: java.lang.ClassNotFoundException: com.sap.db.jdbc.Driver
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.Class.classForName(Native Method)
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ ... 7 more
08-20 15:34:17.330 21714-22168/com.iot.fb.sensor W/System.err﹕ Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
08-20 15:34:30.762 21714-21727/com.iot.fb.sensor W/art﹕ Suspending all threads took: 21.900ms
I assigned a button the startConnect()
method to create a thread running the insert()
method.
public void startConnect(View v) { new Thread(new Runnable() { @Override public void run() { insert(); } }).start(); }
In the insert()
method, I am loading the driver, establishing the connection and inserting my data:
protected void insert(){ try{ Class.forName("com.sap.db.jdbc.Driver"); java.sql.Connection c = java.sql.DriverManager.getConnection("jdbc:sap://***.com:3**15", "myUser", "myPassword"); PreparedStatement st = c.prepareStatement("insert into \"MY_SCHEMA\".\"MY_TABLE\" values (?,?,?)"); int time = (int) (System.currentTimeMillis()); Timestamp tsTemp = new Timestamp(time); st.setTimestamp(1, tsTemp);//TIMESTAMP YYYY-MM-DD HH:SS.FF3 st.setFloat(2, 33);//VALUE_A st.setInt(3, 99);//VALUE_B st.executeUpdate(); st.close(); c.close(); } catch (java.lang.ClassNotFoundException | SQLException | java.lang.ExceptionInInitializerError e){ e.printStackTrace(); }}
How can I fix the driver issue?