// JVM load the .so and calls this native function static jstring Java_x360video_Activities_xMarshal_stringFromJNI(JNIEnv env, jobject thiz, jobject args) { ConsoleExtensions.trace("enter Java_x360video_Activities_xMarshal_stringFromJNI"); if (args != null) { var loctype = env.GetObjectClass(env, args); var gtype = env.NewGlobalRef(env, loctype); //GlobalActivityClass = (jclass)jni->NewGlobalRef(jni->GetObjectClass(activity)); // var startMovieFromNative = env.GetMethodID(env, loctype, "startMovieFromNative", "(Ljava/lang/String;)V"); ConsoleExtensions.tracei64("startMovieFromNative: ", (int)(object)startMovieFromNative); } // do we have a console yet? //Console.WriteLine("enter Java_AndroidBrowserVRNDK_Activities_xMarshal_stringFromJNI"); var n = env.NewStringUTF; //// if we change our NDK code, will nuget packaing work on the background, and also upgrade running apps? var v = n(env, "hello from Java_x360video_Activities_xMarshal_stringFromJNI. yay"); return v; // ConfigurationCreateNuGetPackage.cs }
//I/xNativeActivity(21471): \VrCubeWorld.AppThread.cs:71 mallinfo total allocated space: 2 027 243 344 //I/xNativeActivity(21471): \VrCubeWorld.AppThread.cs:72 mallinfo total free space: 70 957 232 //I/xNativeActivity(21471): \VrApi.ovrMatrix4f.cs:343 out of heap? errno: 12 Out of memory //I/xNativeActivity(21471): \VrCubeWorld.AppThread.cs:71 mallinfo total allocated space: -2 080 212 552 //I/xNativeActivity(21471): \VrCubeWorld.AppThread.cs:72 mallinfo total free space: 74 286 664 //I/xNativeActivity(15462): \VrCubeWorld.AppThread.cs:90 mallinfo total allocated space: 5 512 048 //I/xNativeActivity(15462): \VrCubeWorld.AppThread.cs:91 mallinfo total free space: 13 362 320 //I/xNativeActivity(18481): \VrCubeWorld.AppThread.cs:71 mallinfo total allocated space: -2083023504 //I/xNativeActivity(18481): \VrCubeWorld.AppThread.cs:72 mallinfo total free space: 76 049 040 // https://groups.google.com/forum/#!topic/android-ndk/lcnwzszrESo // http://stackoverflow.com/questions/30480007/is-using-largeheap-in-android-manifest-a-good-practice // https://developer.android.com/reference/android/app/ActivityManager.html#getLargeMemoryClass() // http://dwij.co.in/increase-heap-size-of-android-application/ // http://stackoverflow.com/questions/16957805/android-how-to-increase-application-memory-using-ndk // called by onCreate public ovrAppThread(JNIEnv env, jobject activityObject) { // 1907 ConsoleExtensions.trace("enter ovrAppThread, call pthread_create"); // why keep it? env.GetJavaVM(env, out this.JavaVm); this.ActivityObject = env.NewGlobalRef(env, activityObject); this.Thread = new System.Threading.Thread( delegate() { // can we do closures? ConsoleExtensions.trace("enter thread for vrapi_SubmitFrame"); //malloc_h.malloc_stats(); //xmallinfo(); //ConsoleExtensions.trace("adding memory pressure..."); //var mb = 8 * 1024 * 1024; //var pressure = new byte[mb]; ////System.Threading.Thread.Sleep(1000); //xmallinfo(); ////ConsoleExtensions.trace("adding memory pressure... store..."); ////for (int i = 0; i < mb; i++) ////{ //// pressure[i] = (byte)(0xcc ^ i); ////} ////xmallinfo(); //// GC. would jsc static analysis know it means we can free that memory? //stdlib_h.free(pressure); ////pressure = null; ////System.Threading.Thread.Sleep(1000); //xmallinfo(); // would our chrome app be able to switch over to ndk over udp? this.AppThreadFunction(); } ); this.Thread.Start(); }
// JVM load the .so and calls this native function static long Java_OVROculus360Photos_Activities_xMarshal_nativeSetAppInterface( JNIEnv env, jclass clazz, // ApplicationActivity : com.oculus.vrappframework.VrActivity jobject activity, jstring fromPackageNameString, jstring commandString, jstring uriString ) { // can we do typeof() yet and have our env from there? // Error 3 No overload for method '__android_log_print' takes 3 arguments X:\jsc.svn\examples\java\android\synergy\OVROculus360PhotosNDK\OVROculus360PhotosNDK\xNativeActivity.cs 39 13 OVROculus360PhotosNDK // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150721/ovroculus360photoshud ScriptCoreLibAndroidNDK.Library.ConsoleExtensions.trace("enter Java_OVROculus360Photos_Activities_xMarshal_nativeSetAppInterface"); //Oculus360Photos_h.AtStartBackgroundPanoLoad = new object(); xNativeAtStartBackgroundPanoLoad = xNativeAtStartBackgroundPanoLoadInvoke; //xNativeAtStartBackgroundPanoLoad("not yet loaded", null); var loctype = env.GetObjectClass(env, activity); var gtype = (jclass)env.NewGlobalRef(env, loctype); //var gtype = (jclass)env.NewGlobalRef<jclass>(env, loctype); var typeof_this = new __Type { arg0_env = env, arg1_type = gtype }; //var setDefaultLocale = typeof_this.GetMethodID("setDefaultLocale", "()V"); var setDefaultLocale = typeof_this.GetMethod("setDefaultLocale", "()V"); //var setDefaultLocale = env.GetMethodID(env, loctype, "setDefaultLocale", "()V"); //Type.GetMethod(); ConsoleExtensions.tracei64("setDefaultLocale: ", (int)(object)setDefaultLocale); // I/xNativeActivity(24350): [3194400] \xNativeActivity.cs:202 enter Java_OVROculus360Photos_Activities_xMarshal_nativeSetAppInterface //I/xNativeActivity(24350): [3194400] \xNativeActivity.cs:222 setDefaultLocale: -2012160456 // public virtual void setDefaultLocale() //env.NewStringUTF(env, "en"); // error: undefined reference to '__new_jvalue' // env.CallVoidMethodA(env, activity, setDefaultLocale, args: default(jvalue[])); setDefaultLocale.Invoke(activity); return Oculus360Photos_h.Java_com_oculus_oculus360photossdk_MainActivity_nativeSetAppInterface( env, //clazz, gtype, activity, fromPackageNameString, commandString, uriString, arg_AtStartBackgroundPanoLoad: xNativeAtStartBackgroundPanoLoad ); }
// called by onCreate public ovrAppThread(JNIEnv env, jobject activityObject) { // 1907 ConsoleExtensions.trace("enter ovrAppThread, call pthread_create"); env.GetJavaVM(env, out this.JavaVm); this.ActivityObject = env.NewGlobalRef(env, activityObject); var createErr = pthread.pthread_create(out this.Thread, null, AppThreadFunction, this); // tail call? }
// JVM load the .so and calls this native function static void Java_x360video_Activities_xMarshal_startMovieFromUDP(JNIEnv env, jobject thiz, jobject args) { // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20160103/x360videoui // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20160103/startmoviefromudp // this needs to be done so that we get to play movie from paused state. ConsoleExtensions.trace("enter Java_x360video_Activities_xMarshal_startMovieFromUDP"); // list all menu items. // if one has the filename we need. activate it? //var menu = this.menuitems[0]; //var __ptr = args.__ptr; //var pathName = args.pathName; var t = new __Type { arg0_env = env, arg1_type = (jclass)env.NewGlobalRef(env, env.GetObjectClass(env, args)) }; //sage: 'sart/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: JNI GetFieldID called with pending exception // 'java.lang.NoSuchFieldError' thrown in void x360video.Activities.xMarshal.startMovieFromUDP(java.lang.Obje var field__ptr = env.GetFieldID(env, t.arg1_type, "__ptr", "J"); var __ptr = env.GetLongField(env, args, field__ptr); ConsoleExtensions.tracei64("__ptr", __ptr); ///xNativeActivity(16201): [14349792] \xNativeActivity.cs:138 fieldpathName -2012062200 ///xNativeActivity(16201): [14349792] \xNativeActivity.cs:139 field__ptr -2012062232 // http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/example-1.1/FieldAccess.c var fieldpathName = env.GetFieldID(env, t.arg1_type, "pathName", "Ljava/lang/String;"); ConsoleExtensions.tracei64("fieldpathName", (long)(object)fieldpathName); var jstr = (jstring)env.GetObjectField(env, args, fieldpathName); var isCopy = default(bool); var str = env.GetStringUTFChars(env, jstr, out isCopy); ConsoleExtensions.traces("pathName: ", str); //I/xNativeActivity(19611): [13566168] \xNativeActivity.cs:118 enter Java_x360video_Activities_xMarshal_startMovieFromUDP //I/xNativeActivity(19611): [13566168] \xNativeActivity.cs:138 fieldpathName -2012064080 //I/xNativeActivity(19611): [13566168] \xNativeActivity.cs:139 field__ptr -2012064112 //I/xNativeActivity(19611): \xNativeActivity.cs:153 pathName: /storage/emulated/0/Oculus/360Videos/360 3D 3D VR Timelapse Hanriver TB by ___________________.mp3._TB.mp4 // looky. // we jumped from UI to NDK. and we have the string. // now we need to jump into C++ // C:\Windows\system32>x:\util\android-sdk-windows\platform-tools\adb.exe logcat -s "xNativeActivity" "System.Console" "DEBUG" "PlatformActivity" "Oculus360Videos" // Matrix4f Oculus360Videos::Frame( const VrFrame & vrFrame ) ?? Oculus360Videos_h.startMovieFromUDP(env, __ptr, str); ConsoleExtensions.trace("exit Java_x360video_Activities_xMarshal_startMovieFromUDP"); }