00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00021
00022 #if defined(ANDROID)
00023 #include "androidvmdstart.h"
00024 #include "vmd.h"
00025
00026
00027
00028
00029 #include <stdio.h>
00030 #include <jni.h>
00031
00032 #if !defined(VMD_JNI_CLASSNAME)
00033 #define VMD_JNI_CLASSNAME "edu/uiuc/VMD/VMD"
00034 #endif
00035 #if !defined(VMD_JNI_WRAPFUNC)
00036 #define VMD_JNI_WRAPFUNC Java_edu_uiuc_VMD_VMD_nativeMain
00037 #endif
00038
00039 #define NUM_METHODS 5
00040 #define METH_logOutput 0
00041 #define METH_getNumMsgs 1
00042 #define METH_getPlatformValue 2
00043 #define METH_getMsgBlock 3
00044 #define METH_getMsgNonBlock 4
00045
00046 struct AndroidHandle {
00047 JNIEnv *env;
00048 jobject thiz;
00049 jmethodID meths[NUM_METHODS];
00050 } global_AndHand;
00051
00052
00053 void logtojava(AndroidHandle &ah, const char *logstring)
00054 {
00055
00056 (ah.env)->CallVoidMethod(ah.thiz,
00057 ah.meths[METH_logOutput],
00058 (ah.env)->NewStringUTF( logstring));
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068 char *getPlatformValue(AndroidHandle &ah, const char *key, char *output)
00069 {
00070
00071
00072 jobject j = (ah.env)->CallObjectMethod(ah.thiz,
00073 ah.meths[METH_getPlatformValue],
00074 (ah.env)->NewStringUTF(key));
00075
00076 const char* str = (ah.env)->GetStringUTFChars((jstring) j, NULL);
00077
00078 strcpy(output, str);
00079
00080 (ah.env)->ReleaseStringUTFChars((jstring) j, str);
00081 return output;
00082 }
00083
00084
00085
00086
00087
00088
00089
00090 char *getMessage(AndroidHandle &ah, char *output)
00091 {
00092 jobject j = (ah.env)->CallObjectMethod(ah.thiz,
00093 ah.meths[METH_getMsgBlock]);
00094
00095 const char* str = (ah.env)->GetStringUTFChars((jstring) j, NULL);
00096
00097 strcpy(output, str);
00098
00099 (ah.env)->ReleaseStringUTFChars((jstring) j, str);
00100 return output;
00101 }
00102
00103
00104
00105
00106
00107
00108
00109
00110 char *getMessageNonBlock(AndroidHandle &ah, char *output)
00111 {
00112 jobject j = (ah.env)->CallObjectMethod(ah.thiz,
00113 ah.meths[METH_getMsgNonBlock]);
00114
00115 if (!j) {
00116 return 0;
00117 }
00118
00119 const char* str = (ah.env)->GetStringUTFChars((jstring) j, NULL);
00120
00121 strcpy(output, str);
00122
00123 (ah.env)->ReleaseStringUTFChars((jstring) j, str);
00124 return output;
00125 }
00126
00127
00128
00129
00130
00131 jint getNumMessages(AndroidHandle &ah)
00132 {
00133 return (ah.env)->CallIntMethod(ah.thiz,
00134 ah.meths[METH_getNumMsgs]);
00135 }
00136
00137
00138
00139
00140 void cacheAndroidMethodIDs(AndroidHandle &ah)
00141 {
00142
00143
00144 jclass clazz = (ah.env)->FindClass("edu/uiuc/VMD/VMD");
00145 ah.meths[METH_logOutput] = (ah.env)->GetMethodID(
00146 clazz, "logOutput", "(Ljava/lang/String;)V");
00147 ah.meths[METH_getNumMsgs] = (ah.env)->GetMethodID(
00148 clazz, "getNumMsgs", "()I");
00149 ah.meths[METH_getPlatformValue] = (ah.env)->GetMethodID(
00150 clazz, "getPlatformValue",
00151 "(Ljava/lang/String;)Ljava/lang/String;");
00152 ah.meths[METH_getMsgBlock] = (ah.env)->GetMethodID(
00153 clazz, "getMsgBlock", "()Ljava/lang/String;");
00154 ah.meths[METH_getMsgNonBlock] = (ah.env)->GetMethodID(
00155 clazz, "getMsgNonBlock", "()Ljava/lang/String;");
00156 }
00157
00158 extern "C" {
00159
00160
00161
00162
00163
00164
00165
00166 void log_android(const char *prompt, const char * msg) {
00167 char logstring[2048];
00168
00169 strncpy(logstring, prompt, sizeof(logstring)-2);
00170 strcat(logstring, msg);
00171 strcat(logstring, "\n");
00172
00173 logtojava(global_AndHand, logstring);
00174 }
00175
00176
00177
00178
00179
00180
00181 void VMD_JNI_WRAPFUNC(JNIEnv* env, jobject thiz) {
00182 char* rargv[10];
00183
00184 global_AndHand.env = env;
00185 global_AndHand.thiz = thiz;
00186
00187 cacheAndroidMethodIDs(global_AndHand);
00188
00189 fprintf(stderr, "--stderr fprintf---------------------------------\n");
00190 printf("---regular printf----------------------------\n");
00191 fflush(stdout);
00192 log_android("", "--Log event ---------------------");
00193
00194 #if 1
00195 printf("VMD Android platform info:\n");
00196 printf(" sizeof(char): %d\n", sizeof(char));
00197 printf(" sizeof(int): %d\n", sizeof(int));
00198 printf(" sizeof(long): %d\n", sizeof(long));
00199 printf(" sizeof(void*): %d\n", sizeof(void*));
00200 fflush(stdout);
00201 #endif
00202
00203 char tmp[8192];
00204 const char * vmddir = NULL;
00205
00206
00207 vmddir = "/data/data/edu.uiuc.VMD/files/vmd";
00208
00209 #if 1
00210
00211 char androidappdatadir[8192];
00212
00213 memset(androidappdatadir, 0, sizeof(androidappdatadir));
00214 getPlatformValue(global_AndHand, "FilesDir", androidappdatadir);
00215
00216 if (strlen(androidappdatadir) > 0) {
00217
00218 strcat(androidappdatadir, "/vmd");
00219 vmddir = androidappdatadir;
00220 }
00221 #endif
00222
00223 if (vmddir == NULL) {
00224 return;
00225 }
00226
00227 if (!getenv("VMDDIR")) {
00228 setenv("VMDDIR", vmddir, 1);
00229 }
00230
00231 if (!getenv("TCL_LIBRARY")) {
00232 strcpy(tmp, vmddir);
00233 strcat(tmp, "/scripts/tcl");
00234 setenv("TCL_LIBRARY", tmp, 1);
00235 }
00236
00237 if (!getenv("TK_LIBRARY")) {
00238 strcpy(tmp, vmddir);
00239 strcat(tmp, "/scripts/tk");
00240 setenv("TK_LIBRARY", tmp, 1);
00241 }
00242
00243 if (!getenv("PYTHONPATH")) {
00244 strcpy(tmp, vmddir);
00245 strcat(tmp, "/scripts/python");
00246 setenv("PYTHONPATH", tmp, 1);
00247 } else {
00248 strcpy(tmp, getenv("PYTHONPATH"));
00249 strcat(tmp, ":");
00250 strcat(tmp, vmddir);
00251 strcat(tmp, "/scripts/python");
00252 setenv("PYTHONPATH", tmp, 1);
00253 }
00254
00255 if (!getenv("STRIDE_BIN")) {
00256 strcpy(tmp, vmddir);
00257 #if defined(ARCH_ANDROIDARMV7A)
00258 strcat(tmp, "/stride_ANDROIDARMV7A");
00259 #else
00260 #error unhandled compilation scenario
00261 #endif
00262 setenv("STRIDE_BIN", tmp, 1);
00263 }
00264
00265 if (!getenv("SURF_BIN")) {
00266 strcpy(tmp, vmddir);
00267 #if defined(ARCH_ANDROIDARMV7A)
00268 strcat(tmp, "/surf_ANDROIDARMV7A");
00269 #else
00270 #error unhandled compilation scenario
00271 #endif
00272 setenv("SURF_BIN", tmp, 1);
00273 }
00274
00275 if (!getenv("TACHYON_BIN")) {
00276 strcpy(tmp, vmddir);
00277 #if defined(ARCH_ANDROIDARMV7A)
00278 strcat(tmp, "/tachyon_ANDROIDARMV7A");
00279 #else
00280 #error unhandled compilation scenario
00281 #endif
00282 setenv("TACHYON_BIN", tmp, 1);
00283 }
00284
00285 rargv[0] = (char *) "VMD.so";
00286 #if 1
00287 rargv[1] = (char *) "1e79";
00288 #elif 1
00289 rargv[1] = (char *) "/data/data/edu.uiuc.VMD/files/alanin.pdb";
00290 #else
00291 rargv[1] = (char *) "-h";
00292 #endif
00293 rargv[2] = NULL;
00294
00295 VMDmain(2, rargv);
00296
00297 log_android("", "--Log event ---------------------");
00298 fprintf(stderr, "--stderr fprintf---------------------------------\n");
00299 printf("---regular printf----------------------------\n");
00300 fflush(stdout);
00301 }
00302
00303 }
00304
00305 #endif
00306