diff options
| -rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 6 | ||||
| -rw-r--r-- | graphics/java/android/renderscript/ScriptC.java | 10 | ||||
| -rw-r--r-- | graphics/jni/android_renderscript_RenderScript.cpp | 8 | ||||
| -rw-r--r-- | libs/rs/Android.mk | 6 | ||||
| -rw-r--r-- | libs/rs/rs.spec | 1 | ||||
| -rw-r--r-- | libs/rs/rsScriptC.cpp | 49 | ||||
| -rw-r--r-- | libs/rs/rsScriptC.h | 2 |
7 files changed, 67 insertions, 15 deletions
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index 0b7262b0fbf8..16ad55a21423 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -417,9 +417,9 @@ public class RenderScript { synchronized void nScriptCSetScript(byte[] script, int offset, int length) { rsnScriptCSetScript(mContext, script, offset, length); } - native int rsnScriptCCreate(int con, String val, String cacheDir); - synchronized int nScriptCCreate(String resName, String cacheDir) { - return rsnScriptCCreate(mContext, resName, cacheDir); + native int rsnScriptCCreate(int con, String packageName, String resName, String cacheDir); + synchronized int nScriptCCreate(String packageName, String resName, String cacheDir) { + return rsnScriptCCreate(mContext, packageName, resName, cacheDir); } native void rsnSamplerBegin(int con); diff --git a/graphics/java/android/renderscript/ScriptC.java b/graphics/java/android/renderscript/ScriptC.java index b10247c478e5..c1e4358dd2c5 100644 --- a/graphics/java/android/renderscript/ScriptC.java +++ b/graphics/java/android/renderscript/ScriptC.java @@ -77,8 +77,14 @@ public class ScriptC extends Script { rs.nScriptCBegin(); rs.nScriptCSetScript(pgm, 0, pgmLength); - Log.v(TAG, "Create script for resource = " + resources.getResourceName(resourceID)); + + // E.g, /system/apps/Fountain.apk + String packageName = rs.getApplicationContext().getPackageResourcePath(); + // For res/raw/fountain.bc, it wil be /com.android.fountain:raw/fountain + String resName = resources.getResourceName(resourceID); String cacheDir = rs.getApplicationContext().getCacheDir().toString(); - return rs.nScriptCCreate(resources.getResourceName(resourceID), cacheDir); + + Log.v(TAG, "Create script for resource = " + resName); + return rs.nScriptCCreate(packageName, resName, cacheDir); } } diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index 493653aac923..9da442843995 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -902,12 +902,14 @@ exit: } static jint -nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring resName, jstring cacheDir) +nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring packageName, jstring resName, jstring cacheDir) { LOG_API("nScriptCCreate, con(%p)", con); + const char* packageNameUTF = _env->GetStringUTFChars(packageName, NULL); const char* resNameUTF = _env->GetStringUTFChars(resName, NULL); const char* cacheDirUTF = _env->GetStringUTFChars(cacheDir, NULL); - jint i = (jint)rsScriptCCreate(con, resNameUTF, cacheDirUTF); + jint i = (jint)rsScriptCCreate(con, packageNameUTF, resNameUTF, cacheDirUTF); + _env->ReleaseStringUTFChars(packageName, packageNameUTF); _env->ReleaseStringUTFChars(resName, resNameUTF); _env->ReleaseStringUTFChars(cacheDir, cacheDirUTF); return i; @@ -1301,7 +1303,7 @@ static JNINativeMethod methods[] = { {"rsnScriptCBegin", "(I)V", (void*)nScriptCBegin }, {"rsnScriptCSetScript", "(I[BII)V", (void*)nScriptCSetScript }, -{"rsnScriptCCreate", "(ILjava/lang/String;Ljava/lang/String;)I", (void*)nScriptCCreate }, +{"rsnScriptCCreate", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", (void*)nScriptCCreate }, {"rsnProgramStoreBegin", "(III)V", (void*)nProgramStoreBegin }, {"rsnProgramStoreDepthFunc", "(II)V", (void*)nProgramStoreDepthFunc }, diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk index 2ec003f989ea..c2e58b663ae2 100644 --- a/libs/rs/Android.mk +++ b/libs/rs/Android.mk @@ -113,11 +113,11 @@ LOCAL_SRC_FILES:= \ rsVertexArray.cpp -LOCAL_SHARED_LIBRARIES += libcutils libutils libEGL libGLESv1_CM libGLESv2 libui libbcc +LOCAL_SHARED_LIBRARIES += libz libcutils libutils libEGL libGLESv1_CM libGLESv2 libui libbcc -LOCAL_STATIC_LIBRARIES := libft2 librslib_rt +LOCAL_STATIC_LIBRARIES := libdex libft2 librslib_rt -LOCAL_C_INCLUDES += external/freetype/include +LOCAL_C_INCLUDES += external/freetype/include external/zlib dalvik LOCAL_LDLIBS := -lpthread -ldl LOCAL_MODULE:= libRS diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index cf94060e42fb..021ff92cf7fd 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -321,6 +321,7 @@ ScriptCSetText { } ScriptCCreate { + param const char * packageName param const char * resName param const char * cacheDir ret RsScript diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 0ae85cba6100..5197eeb2216f 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -20,6 +20,9 @@ #include "../../compile/libbcc/include/bcc/bcc.h" #include "utils/Timers.h" #include "utils/StopWatch.h" +extern "C" { +#include "libdex/ZipArchive.h" +} #include <GLES/gl.h> #include <GLES/glext.h> @@ -402,7 +405,12 @@ static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name) { extern const char rs_runtime_lib_bc[]; extern unsigned rs_runtime_lib_bc_size; -void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir) { +void ScriptCState::runCompiler(Context *rsc, + ScriptC *s, + long modWhen, + long crc32, + const char *resName, + const char *cacheDir) { { s->mBccScript = bccCreateScript(); s->mEnviroment.mIsThreadable = true; @@ -413,6 +421,8 @@ void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName, co if (bccReadBC(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength, + modWhen, + crc32, resName, cacheDir) >= 0) { //bccLinkBC(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size); @@ -424,6 +434,8 @@ void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName, co bccReadBC(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength, + modWhen, + crc32, NULL, cacheDir); bccCompileBC(s->mBccScript); @@ -542,7 +554,11 @@ void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) { ss->mScript->mEnviroment.mScriptTextLength = len; } -RsScript rsi_ScriptCCreate(Context * rsc, const char *resName, const char *cacheDir) + +RsScript rsi_ScriptCCreate(Context *rsc, + const char *packageName, + const char *resName, + const char *cacheDir) { ScriptCState *ss = &rsc->mScriptC; @@ -550,7 +566,34 @@ RsScript rsi_ScriptCCreate(Context * rsc, const char *resName, const char *cache ss->mScript.clear(); s->incUserRef(); - ss->runCompiler(rsc, s.get(), resName, cacheDir); + // Open the apk and return the ZipArchive: + // int dexZipOpenArchive(const char* fileName, ZipArchive* pArchive) + ZipArchive archive; + long modWhen; + long crc32; + if (!dexZipOpenArchive(packageName, &archive)) { // Success + ZipEntry entry = dexZipFindEntry(&archive, resName); + + int method; + size_t uncompLen; + size_t compLen; + off_t offset; + if (!dexZipGetEntryInfo(&archive, + entry, + &method, + &uncompLen, + &compLen, + &offset, + &modWhen, + &crc32)) { + } else { + LOGI("Coudn't get entry info for the bitcode in an apk"); + } + } else { + LOGI("Couldn't open the archive and read the bitcode"); + } + + ss->runCompiler(rsc, s.get(), modWhen, crc32, resName, cacheDir); ss->clear(rsc); return s.get(); } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index a71413294394..4cb5ade98c28 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -83,7 +83,7 @@ public: void init(Context *rsc); void clear(Context *rsc); - void runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir); + void runCompiler(Context *rsc, ScriptC *s, long modWhen, long crc32, const char *resName, const char *cacheDir); struct SymbolTable_t { const char * mName; |