summaryrefslogtreecommitdiffstats
path: root/test/native/cross-android-armv7-tst1/hello-java.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/native/cross-android-armv7-tst1/hello-java.c')
-rw-r--r--test/native/cross-android-armv7-tst1/hello-java.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/test/native/cross-android-armv7-tst1/hello-java.c b/test/native/cross-android-armv7-tst1/hello-java.c
new file mode 100644
index 0000000..51826e4
--- /dev/null
+++ b/test/native/cross-android-armv7-tst1/hello-java.c
@@ -0,0 +1,119 @@
+#include <stdio.h>
+#include <math.h>
+
+#include <jni.h>
+#include <dlfcn.h>
+
+typedef jint (*FPTR_JNI_GetDefaultJavaVMInitArgs)(void*);
+typedef jint (*FPTR_JNI_CreateJavaVM)(JavaVM**, JNIEnv**, void*);
+typedef jint (*FPTR_JNI_GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);
+
+static const char * FN_JVM_LIB_NAME = "libdvm.so";
+static const char * FN_JNI_GetDefaultJavaVMInitArgs = "JNI_GetDefaultJavaVMInitArgs";
+static const char * FN_JNI_CreateJavaVM = "JNI_CreateJavaVM";
+static const char * FN_JNI_GetCreatedJavaVMs = "JNI_GetCreatedJavaVMs";
+
+int main(int argc, char ** argv) {
+ void * jvmLibHandle;
+ FPTR_JNI_GetDefaultJavaVMInitArgs fptr_JNI_GetDefaultJavaVMInitArgs;
+ FPTR_JNI_CreateJavaVM fptr_JNI_CreateJavaVM;
+ FPTR_JNI_GetCreatedJavaVMs fptr_JNI_GetCreatedJavaVMs;
+ jint jres;
+
+ JavaVM *jvm; /* denotes a Java VM */
+ JNIEnv *env; /* pointer to native method interface */
+
+#if 0
+ const int vm_options_count = 4;
+ JavaVMOption vm_options[vm_options_count];
+ {
+ int i=0;
+ vm_options[i++].optionString = "-Djava.compiler=NONE"; /* disable JIT */
+ vm_options[i++].optionString = "-Djava.class.path=c:\myclasses"; /* user classes */
+ vm_options[i++].optionString = "-Djava.library.path=c:\mylibs"; /* set native library path */
+ vm_options[i++].optionString = "-verbose:jni"; /* print JNI-related messages */
+ }
+#else
+ const int vm_options_count = 1;
+ JavaVMOption vm_options[vm_options_count];
+ {
+ int i=0;
+ vm_options[i++].optionString = "-Djava.class.path=HelloJava.jar"; /* user classes (OK) */
+ // vm_options[i++].optionString = "-cp HelloJava.jar"; /* user classes (NOT OK) */
+ // vm_options[i++].optionString = "-cp"; /* user classes (OK) */
+ // vm_options[i++].optionString = "HelloJava.jar"; /* user classes (OK) */
+ }
+#endif
+ JavaVMInitArgs vm_args; /* VM initialization arguments */
+
+ jvmLibHandle = dlopen(FN_JVM_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
+ if(NULL == jvmLibHandle) {
+ fprintf(stderr, "Error: Could not open %s, abort\n", FN_JVM_LIB_NAME);
+ return -1;
+ }
+ fptr_JNI_GetDefaultJavaVMInitArgs = (FPTR_JNI_GetDefaultJavaVMInitArgs) dlsym(jvmLibHandle, FN_JNI_GetDefaultJavaVMInitArgs);
+ if(NULL == fptr_JNI_GetDefaultJavaVMInitArgs) {
+ fprintf(stderr, "Error: Could not resolve %s, abort\n", FN_JNI_GetDefaultJavaVMInitArgs);
+ return -1;
+ }
+ fptr_JNI_CreateJavaVM = (FPTR_JNI_CreateJavaVM) dlsym(jvmLibHandle, FN_JNI_CreateJavaVM);
+ if(NULL == fptr_JNI_CreateJavaVM) {
+ fprintf(stderr, "Error: Could not resolve %s, abort\n", FN_JNI_CreateJavaVM);
+ return -1;
+ }
+ fptr_JNI_GetCreatedJavaVMs = (FPTR_JNI_GetCreatedJavaVMs) dlsym(jvmLibHandle, FN_JNI_GetCreatedJavaVMs);
+ if(NULL == fptr_JNI_GetCreatedJavaVMs) {
+ fprintf(stderr, "Error: Could not resolve %s, abort\n", FN_JNI_GetCreatedJavaVMs);
+ return -1;
+ }
+
+ /* Get the default initialization arguments and set the class
+ * path */
+ /**
+ jres = fptr_JNI_GetDefaultJavaVMInitArgs(&vm_args);
+ if(JNI_OK != jres) {
+ fprintf(stderr, "Error: JNI_GetDefaultJavaVMInitArgs failed: %d, abort\n", jres);
+ return -1;
+ } */
+ // vm_args.classpath = ...;
+
+ vm_args.version = JNI_VERSION_1_2;
+ vm_args.options = vm_options;
+ vm_args.nOptions = vm_options_count;
+ vm_args.ignoreUnrecognized = JNI_TRUE;
+
+ /* load and initialize a Java VM, return a JNI interface
+ * pointer in env */
+ jres = fptr_JNI_CreateJavaVM(&jvm, &env, &vm_args);
+ if(JNI_OK != jres) {
+ fprintf(stderr, "Error: JNI_CreateJavaVM failed: %d, abort\n", jres);
+ return -1;
+ }
+ fprintf(stderr, "Info: VM created\n");
+
+ /* invoke the HelloJava.test method using the JNI */
+ jclass cls = (*env)->FindClass(env, "HelloJava");
+ if(NULL == cls) {
+ fprintf(stderr, "Error: Could not resolve Class HelloJava, abort\n");
+ (*jvm)->DestroyJavaVM(jvm);
+ return -1;
+ }
+ fprintf(stderr, "Info: Found Class HelloJava\n");
+
+ jmethodID mid = (*env)->GetStaticMethodID(env, cls, "test", "(I)V");
+ if(NULL == cls) {
+ fprintf(stderr, "Error: Could not resolve Method \"void HelloJava.test(int)\", abort\n");
+ (*jvm)->DestroyJavaVM(jvm);
+ return -1;
+ }
+ fprintf(stderr, "Info: Found Method HelloJava.test(int)\n");
+
+ (*env)->CallStaticVoidMethod(env, cls, mid, 100);
+ fprintf(stderr, "Info: post invocation\n");
+
+ /* We are done. */
+ (*jvm)->DestroyJavaVM(jvm);
+ fprintf(stderr, "Info: post VM\n");
+
+ return 0;
+}