summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/jni/android_app_NativeActivity.cpp174
1 files changed, 90 insertions, 84 deletions
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp
index 6431b94be4d3..fd9e714618e5 100644
--- a/core/jni/android_app_NativeActivity.cpp
+++ b/core/jni/android_app_NativeActivity.cpp
@@ -45,6 +45,7 @@
#include "core_jni_helpers.h"
+#include "ScopedUtfChars.h"
#define LOG_TRACE(...)
//#define LOG_TRACE(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
@@ -264,103 +265,108 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName
ALOGD("loadNativeCode_native");
}
- const char* pathStr = env->GetStringUTFChars(path, NULL);
+ ScopedUtfChars pathStr(env, path);
std::unique_ptr<NativeCode> code;
- bool needNativeBridge = false;
+ bool needs_native_bridge = false;
+ std::string error_msg;
- void* handle = OpenNativeLibrary(env, sdkVersion, pathStr, classLoader, libraryPath);
- if (handle == NULL) {
- if (NativeBridgeIsSupported(pathStr)) {
- handle = NativeBridgeLoadLibrary(pathStr, RTLD_LAZY);
- needNativeBridge = true;
- }
+ void* handle = OpenNativeLibrary(env,
+ sdkVersion,
+ pathStr.c_str(),
+ classLoader,
+ libraryPath,
+ &needs_native_bridge,
+ &error_msg);
+
+ if (handle == nullptr) {
+ ALOGW("NativeActivity LoadNativeLibrary(\"%s\") failed: %s",
+ pathStr.c_str(),
+ error_msg.c_str());
+ return 0;
}
- env->ReleaseStringUTFChars(path, pathStr);
- if (handle != NULL) {
- void* funcPtr = NULL;
- const char* funcStr = env->GetStringUTFChars(funcName, NULL);
- if (needNativeBridge) {
- funcPtr = NativeBridgeGetTrampoline(handle, funcStr, NULL, 0);
- } else {
- funcPtr = dlsym(handle, funcStr);
- }
+ void* funcPtr = NULL;
+ const char* funcStr = env->GetStringUTFChars(funcName, NULL);
+ if (needs_native_bridge) {
+ funcPtr = NativeBridgeGetTrampoline(handle, funcStr, NULL, 0);
+ } else {
+ funcPtr = dlsym(handle, funcStr);
+ }
- code.reset(new NativeCode(handle, (ANativeActivity_createFunc*)funcPtr));
- env->ReleaseStringUTFChars(funcName, funcStr);
+ code.reset(new NativeCode(handle, (ANativeActivity_createFunc*)funcPtr));
+ env->ReleaseStringUTFChars(funcName, funcStr);
- if (code->createActivityFunc == NULL) {
- ALOGW("ANativeActivity_onCreate not found");
- return 0;
- }
-
- code->messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueue);
- if (code->messageQueue == NULL) {
- ALOGW("Unable to retrieve native MessageQueue");
- return 0;
- }
-
- int msgpipe[2];
- if (pipe(msgpipe)) {
- ALOGW("could not create pipe: %s", strerror(errno));
- return 0;
- }
- code->mainWorkRead = msgpipe[0];
- code->mainWorkWrite = msgpipe[1];
- int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK);
- SLOGW_IF(result != 0, "Could not make main work read pipe "
- "non-blocking: %s", strerror(errno));
- result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK);
- SLOGW_IF(result != 0, "Could not make main work write pipe "
- "non-blocking: %s", strerror(errno));
- code->messageQueue->getLooper()->addFd(
- code->mainWorkRead, 0, ALOOPER_EVENT_INPUT, mainWorkCallback, code.get());
-
- code->ANativeActivity::callbacks = &code->callbacks;
- if (env->GetJavaVM(&code->vm) < 0) {
- ALOGW("NativeActivity GetJavaVM failed");
- return 0;
- }
- code->env = env;
- code->clazz = env->NewGlobalRef(clazz);
+ if (code->createActivityFunc == NULL) {
+ ALOGW("ANativeActivity_onCreate not found");
+ return 0;
+ }
- const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL);
- code->internalDataPathObj = dirStr;
- code->internalDataPath = code->internalDataPathObj.string();
- env->ReleaseStringUTFChars(internalDataDir, dirStr);
-
- if (externalDataDir != NULL) {
- dirStr = env->GetStringUTFChars(externalDataDir, NULL);
- code->externalDataPathObj = dirStr;
- env->ReleaseStringUTFChars(externalDataDir, dirStr);
- }
- code->externalDataPath = code->externalDataPathObj.string();
+ code->messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueue);
+ if (code->messageQueue == NULL) {
+ ALOGW("Unable to retrieve native MessageQueue");
+ return 0;
+ }
+
+ int msgpipe[2];
+ if (pipe(msgpipe)) {
+ ALOGW("could not create pipe: %s", strerror(errno));
+ return 0;
+ }
+ code->mainWorkRead = msgpipe[0];
+ code->mainWorkWrite = msgpipe[1];
+ int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK);
+ SLOGW_IF(result != 0, "Could not make main work read pipe "
+ "non-blocking: %s", strerror(errno));
+ result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK);
+ SLOGW_IF(result != 0, "Could not make main work write pipe "
+ "non-blocking: %s", strerror(errno));
+ code->messageQueue->getLooper()->addFd(
+ code->mainWorkRead, 0, ALOOPER_EVENT_INPUT, mainWorkCallback, code.get());
- code->sdkVersion = sdkVersion;
-
- code->assetManager = assetManagerForJavaObject(env, jAssetMgr);
+ code->ANativeActivity::callbacks = &code->callbacks;
+ if (env->GetJavaVM(&code->vm) < 0) {
+ ALOGW("NativeActivity GetJavaVM failed");
+ return 0;
+ }
+ code->env = env;
+ code->clazz = env->NewGlobalRef(clazz);
- if (obbDir != NULL) {
- dirStr = env->GetStringUTFChars(obbDir, NULL);
- code->obbPathObj = dirStr;
- env->ReleaseStringUTFChars(obbDir, dirStr);
- }
- code->obbPath = code->obbPathObj.string();
+ const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL);
+ code->internalDataPathObj = dirStr;
+ code->internalDataPath = code->internalDataPathObj.string();
+ env->ReleaseStringUTFChars(internalDataDir, dirStr);
- jbyte* rawSavedState = NULL;
- jsize rawSavedSize = 0;
- if (savedState != NULL) {
- rawSavedState = env->GetByteArrayElements(savedState, NULL);
- rawSavedSize = env->GetArrayLength(savedState);
- }
+ if (externalDataDir != NULL) {
+ dirStr = env->GetStringUTFChars(externalDataDir, NULL);
+ code->externalDataPathObj = dirStr;
+ env->ReleaseStringUTFChars(externalDataDir, dirStr);
+ }
+ code->externalDataPath = code->externalDataPathObj.string();
- code->createActivityFunc(code.get(), rawSavedState, rawSavedSize);
+ code->sdkVersion = sdkVersion;
- if (rawSavedState != NULL) {
- env->ReleaseByteArrayElements(savedState, rawSavedState, 0);
- }
+ code->assetManager = assetManagerForJavaObject(env, jAssetMgr);
+
+ if (obbDir != NULL) {
+ dirStr = env->GetStringUTFChars(obbDir, NULL);
+ code->obbPathObj = dirStr;
+ env->ReleaseStringUTFChars(obbDir, dirStr);
}
-
+ code->obbPath = code->obbPathObj.string();
+
+ jbyte* rawSavedState = NULL;
+ jsize rawSavedSize = 0;
+ if (savedState != NULL) {
+ rawSavedState = env->GetByteArrayElements(savedState, NULL);
+ rawSavedSize = env->GetArrayLength(savedState);
+ }
+
+ code->createActivityFunc(code.get(), rawSavedState, rawSavedSize);
+
+ if (rawSavedState != NULL) {
+ env->ReleaseByteArrayElements(savedState, rawSavedState, 0);
+ }
+
return (jlong)code.release();
}