Small JNI example that
- calls C++ from Java
- calls Java from C++
- calls Java from native thread
- creates instances with parameters
- returns array of custom classes from C to Java
- throws exception in native code
- uses Java wrapper object that owns C++ object to show basic JNI usage.
Does currently only contain a build "script" for Visual Studio, but the files run the same on other platforms if compiled correctly.
- Fix paths in build.bat
- Open the Visual Studio command prompt (watch to run the correct one, 32bit vs 64bit, matching your VM).
- enter repo root directory
- run build.bat
-
list functions + signatures of Java class
javap -s -p {CLASS}
-
list object exports (Visual Studio)
dumpbin.exe /exports {DLL PATH}
- https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html
- http://adamish.com/blog/archives/327
- https://thebreakfastpost.com/2012/01/23/wrapping-a-c-library-with-jni-part-1/
- http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
- RAII wrapper for JNI
- Java Exception handling in JNI
- Android JNI tips
- JNI usage in an Eclipse plugin
- IBM developerWorks - Java programming with JNI
- Simple method for creating Java Objects in C++
- Android has multiple classlaoders, so env->FindClass might fail depending on context where it is executed. Have a look at http://stackoverflow.com/a/16302771 (also see comments), and don't forget to make the ClassLoader ref global...
- When calling back into an Android app from a native thread you are on a non-UI thread. Trying to update will fail (just as if called from a Java worker thread). Use runOnUiThread to dispatch "offending" code to UI thread.
- When using JNI in e.g. Tomcat and trying to reload you application, the reload will fail. Tomcat generates a new classloader for each application, but in one VM instance only one classloader may have loaded a particular native lib. See http://stackoverflow.com/a/13242602 for a workaround.