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