| 234 | } |
| 235 | |
| 236 | JNI_EXPORTED_FUNCTION(ANDROID_PACKAGE_NAME_JNI, NativeServer, runServer, jint, JNIEnv *pEnv, jobject Object, jstring WorkingDirectory, jobjectArray ArgumentsArray) |
| 237 | { |
| 238 | // Set working directory to external storage location. This is not possible |
| 239 | // in Java so we pass the intended working directory to the native code. |
| 240 | const char *pWorkingDirectory = pEnv->GetStringUTFChars(WorkingDirectory, nullptr); |
| 241 | const bool WorkingDirectoryError = fs_chdir(pWorkingDirectory) != 0; |
| 242 | pEnv->ReleaseStringUTFChars(WorkingDirectory, pWorkingDirectory); |
| 243 | if(WorkingDirectoryError) |
| 244 | { |
| 245 | return -1001; |
| 246 | } |
| 247 | |
| 248 | const jsize NumArguments = pEnv->GetArrayLength(ArgumentsArray); |
| 249 | |
| 250 | std::vector<std::string> vArguments; |
| 251 | vArguments.reserve(NumArguments + 1); |
| 252 | vArguments.push_back(std::string(pWorkingDirectory) + "/" + GAME_NAME "-Server"); |
| 253 | for(jsize ArgumentIndex = 0; ArgumentIndex < NumArguments; ArgumentIndex++) |
| 254 | { |
| 255 | jstring ArgumentString = (jstring)pEnv->GetObjectArrayElement(ArgumentsArray, ArgumentIndex); |
| 256 | const char *pArgumentString = pEnv->GetStringUTFChars(ArgumentString, nullptr); |
| 257 | vArguments.emplace_back(pArgumentString); |
| 258 | pEnv->ReleaseStringUTFChars(ArgumentString, pArgumentString); |
| 259 | } |
| 260 | |
| 261 | std::vector<const char *> vpArguments; |
| 262 | vpArguments.reserve(vArguments.size()); |
| 263 | for(const std::string &Argument : vArguments) |
| 264 | { |
| 265 | vpArguments.emplace_back(Argument.c_str()); |
| 266 | } |
| 267 | |
| 268 | return main(vpArguments.size(), vpArguments.data()); |
| 269 | } |
| 270 | |
| 271 | JNI_EXPORTED_FUNCTION(ANDROID_PACKAGE_NAME_JNI, NativeServer, executeCommand, void, JNIEnv *pEnv, jobject Object, jstring Command) |
| 272 | { |