• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #if !defined(__clang__)
2 
3 #include <nativehelper/jni.h>
4 #include <android/log.h>
5 #include <bcc/bcc.h>
6 #include <dlfcn.h>
7 
8 
9 #define LOG_TAG "libjni_photoeditor"
10 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
11 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
12 
13 #include "_jni.h"
14 
15 #define DEFINE(f) { #f, 0 },
16 JNIFuncType JNIFunc[JNI_max] =
17 {
18 #include "_jnif.h"
19 };
20 #undef DEFINE
21 
JNI_OnLoad(JavaVM * vm,void * reserved)22 jint JNI_OnLoad(JavaVM* vm, void* reserved)
23 {
24     LOGI("JNI_OnLoad\n");
25 
26 #define DEFINE(f) JNIFunc[ JNI_ ## f ].func_ptr = (void *)f;
27    #include "_jnif.h"
28 #undef DEFINE
29 
30     return JNI_VERSION_1_4;
31 }
32 
lookupSymbol(void * pContext,const char * name)33 static void* lookupSymbol(void* pContext, const char* name)
34 {
35     return (void*) dlsym(RTLD_DEFAULT, name);
36 }
37 
Java_com_android_photoeditor_filters_ImageUtils_init(JNIEnv * env,jobject obj,jbyteArray scriptRef,jint length)38 extern "C" JNIEXPORT jboolean JNICALL Java_com_android_photoeditor_filters_ImageUtils_init(
39     JNIEnv *env, jobject obj, jbyteArray scriptRef, jint length)
40 {
41     void *new_func_ptr[JNI_max];
42     int i, all_func_found = 1;
43 
44     BCCScriptRef script_ref = bccCreateScript();
45     jbyte* script_ptr = (jbyte *)env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
46     LOGI("BCC Script Len: %d", length);
47     if (bccReadBC(script_ref, "libjni_photoeditor_portable.bc", (const char*)script_ptr, length, 0)) {
48         LOGE("Error! Cannot bccReadBc");
49         return JNI_FALSE;
50     }
51     if (script_ptr) {
52         env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr, 0);
53     }
54   #if 0
55     if (bccLinkFile(script_ref, "/system/lib/libclcore.bc", 0)) {
56         LOGE("Error! Cannot bccLinkBC");
57         return JNI_FALSE;
58     }
59   #endif
60     bccRegisterSymbolCallback(script_ref, lookupSymbol, NULL);
61     if (bccPrepareExecutableEx(script_ref, ".", "/data/data/com.android.photoeditor/photoeditorLLVM", 0)) {
62         LOGE("Error! Cannot bccPrepareExecutableEx");
63         return JNI_FALSE;
64     }
65     for(i=0; i<JNI_max; i++) {
66         new_func_ptr[i] = bccGetFuncAddr(script_ref, JNIFunc[i].func_name);
67         if (new_func_ptr[i] == NULL) {
68 	    LOGE("Error! Cannot find %s()\n", JNIFunc[i].func_name);
69 	    all_func_found = 0;
70           //return JNI_FALSE;
71 	} else
72             LOGI("Found %s() @ 0x%x", JNIFunc[i].func_name, (unsigned)new_func_ptr[i]);
73     }
74 
75    //bccDisposeScript(script_ref);
76 
77     if (all_func_found)
78     {
79         LOGI("Use LLVM version");
80         for(i=0; i<JNI_max; i++)
81 	     JNIFunc[i].func_ptr = new_func_ptr[i];
82     }
83 
84     return JNI_TRUE;
85 }
86 
87 #endif // __clang__