Browse Source

Cpp integration

Denis Sachkov 9 years ago
parent
commit
078babbda7

+ 4 - 1
android/build.gradle

@@ -18,7 +18,10 @@ apply plugin: 'com.android.library'
 
 
 dependencies {
 dependencies {
         compile(project(':oxygine-extension'))
         compile(project(':oxygine-extension'))
-    }
+        compile 'com.google.android.gms:play-services-ads:8.+'
+}
+
+
 
 
 android {
 android {
 		lintOptions {
 		lintOptions {

+ 89 - 10
android/src/org/oxygine/admob/AdmobAdapter.java

@@ -2,25 +2,104 @@ package org.oxygine.admob;
 
 
 import android.app.Activity;
 import android.app.Activity;
 import android.content.Intent;
 import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
 
 
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.oxygine.lib.extension.ActivityObserver;
+import com.google.android.gms.ads.AdListener;
+import com.google.android.gms.ads.AdRequest;
+import com.google.android.gms.ads.InterstitialAd;
 
 
-import java.util.Arrays;
+import org.oxygine.lib.extension.ActivityObserver;
 
 
 public class AdmobAdapter extends ActivityObserver
 public class AdmobAdapter extends ActivityObserver
 {
 {
     private static String TAG = "AdmobAdapter";
     private static String TAG = "AdmobAdapter";
+    private Activity _activity;
+
+    private String _testDeviceID;
+
+    InterstitialAd mInterstitialAd;
+
+    public static int ON_LOADED = 1;
+    public static int ON_FAILED = 2;
+    public static int ON_OPENED = 3;
+    public static int ON_CLOSED = 4;
+
+
+    public static native void onNativeChanged(int newStatus);
+
+    public AdmobAdapter(Activity a, String UNIT_ID, String testDeviceID) {
+        _activity = a;
+        _testDeviceID = testDeviceID;
+
+        mInterstitialAd = new InterstitialAd(_activity);
+        mInterstitialAd.setAdUnitId(UNIT_ID);
+
+        mInterstitialAd.setAdListener(new AdListener() {
+
+            @Override
+            public void onAdClosed() {
+                onNativeChanged(ON_CLOSED);
+            }
+
+            @Override
+            public void onAdFailedToLoad(int errorCode) {
+                onNativeChanged(ON_FAILED);
+            }
+
+            @Override
+            public void onAdLeftApplication() {
+            }
+
+            @Override
+            public void onAdOpened() {
+                onNativeChanged(ON_OPENED);
+            }
+
+            @Override
+            public void onAdLoaded() {
+                onNativeChanged(ON_LOADED);
+            }
+        });
 
 
-    public AdmobAdapter(Activity a) {
 
 
     }
     }
 
 
-    @Override
+    public boolean isLoaded()
+    {
+        return mInterstitialAd.isLoaded();
+    }
+
+    public void show()
+    {
+        if (!isLoaded())
+            return;
+
+        _activity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mInterstitialAd.show();
+            }
+        });
+    }
+
+    public void load()
+    {
+        if (isLoaded())
+            return;
+
+        _activity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                AdRequest.Builder builder = new AdRequest.Builder();
+                if (!_testDeviceID.isEmpty())
+                    builder.addTestDevice(_testDeviceID);
+
+                AdRequest adRequest = builder.build();
+                mInterstitialAd.loadAd(adRequest);
+            }
+        });
+    }
+
+    /*@Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
 
 
     }
     }
@@ -36,5 +115,5 @@ public class AdmobAdapter extends ActivityObserver
     @Override
     @Override
     public void onPause() {
     public void onPause() {
 
 
-    }
+    }*/
 }
 }

+ 35 - 10
src/admob.cpp

@@ -62,27 +62,52 @@ namespace admob
         log::messageln("admob::free done");
         log::messageln("admob::free done");
     }
     }
 
 
-    /*void doSomething()
+    void load()
     {
     {
+#if !ADMOB_EXT_ENABLED
+        return;
+#endif
+
+
 #ifdef __ANDROID__
 #ifdef __ANDROID__
-        jniDoSomethingInJava();
-#elif TARGET_OS_IPHONE
-        jniDoSomethingInObjectiveC();
-#else
-        simulatorFunction();
+        jniAdmobLoad();
+#endif
+    }
+
+    void show()
+    {
+#if !ADMOB_EXT_ENABLED
+        return;
+#endif
+
+        
+#ifdef __ANDROID__
+        jniAdmobShow();
+#endif
+    }
+
+    bool isLoaded()
+    {
+#if !ADMOB_EXT_ENABLED
+        return false;
 #endif
 #endif
         
         
-    }*/
 
 
+#ifdef __ANDROID__
+        return  jniAdmobIsLoaded();
+#endif
+        return false;
+    }
 
 
+    
     namespace internal
     namespace internal
     {
     {
 
 
-        /*void callItFromNativeCallback()
+        void onChange(int newStatus)
         {
         {
-            YourEventExample ev;
+            OnChangeEvent ev(newStatus);
             _dispatcher->dispatchEvent(&ev);
             _dispatcher->dispatchEvent(&ev);
-        }*/
+        }
     }
     }
 }
 }
 
 

+ 13 - 5
src/admob.h

@@ -15,19 +15,27 @@ namespace admob
     void init();
     void init();
     void free();
     void free();
 
 
-    /*class YourEventExample : public Event
+	const static int ON_LOADED = 1;
+	const static int ON_FAILED = 2;
+	const static int ON_OPENED = 3;
+	const static int ON_CLOSED = 4;
+
+    class OnChangeEvent : public Event
     {
     {
     public:
     public:
         enum { EVENT = sysEventID('f', 'b', 't')};
         enum { EVENT = sysEventID('f', 'b', 't')};
-        YourEventExample() : Event(EVENT) {};
-    };*/
+        OnChangeEvent(int newStatus) : Event(EVENT),newStatus(newStatus) {};
+        int newStatus = 0;
+    };
 
 
     spEventDispatcher dispatcher();
     spEventDispatcher dispatcher();
 
 
-    //void doSomething();
+    void load();
+    void show();
+    bool isLoaded();
 
 
     namespace internal
     namespace internal
     {
     {
-            //void callItFromNativeCallback();
+            void onChange(int newStatus);
     }
     }
 };
 };

+ 73 - 8
src/android/AndroidAdmob.cpp

@@ -24,18 +24,13 @@ bool isAdmobEnabled()
 
 
 extern "C"
 extern "C"
 {
 {
-    /*JNIEXPORT void JNICALL Java_org_oxygine_admob_AdmobAdapter_YOUR_FUNC_NAME(JNIEnv* env, jobject obj, jstring json_data, jboolean error)
+    JNIEXPORT void JNICALL Java_org_oxygine_admob_AdmobAdapter_onNativeChanged(JNIEnv* env, jobject obj, int newStatus)
     {
     {
-        string data = jniGetString(env, json_data);
-
         core::getMainThreadDispatcher().postCallback([ = ]()
         core::getMainThreadDispatcher().postCallback([ = ]()
         {
         {
-            //call internal function there from src/admob/admob.h
-            admob::internal::callItFromNativeCallback();
+            admob::internal::onChange(newStatus);
         });
         });
-    }*/
-
-
+    }
 }
 }
 
 
 
 
@@ -84,6 +79,76 @@ void jniAdmobFree()
     }
     }
 }
 }
 
 
+void jniAdmobShow()
+{
+    if (!isAdmobEnabled())
+        return;
+            
+    try
+    {
+        JNIEnv* env = jniGetEnv();
+        LOCAL_REF_HOLDER(env);
+        
+        jmethodID jmethod = env->GetMethodID(_jAdmobClass, "show", "()V");
+        JNI_NOT_NULL(jmethod);
+        
+        env->CallBooleanMethod(_jAdmobObject, jmethod);
+    }
+    catch (const notFound&)
+    {
+        log::error("jniAdmobLoad failed, class/member not found");
+    }
+}
+
+
+void jniAdmobLoad()
+{
+    if (!isAdmobEnabled())
+        return;
+
+    try
+    {
+        JNIEnv* env = jniGetEnv();
+        LOCAL_REF_HOLDER(env);
+        
+        jmethodID jmethod = env->GetMethodID(_jAdmobClass, "load", "()V");
+        JNI_NOT_NULL(jmethod);
+        
+        env->CallBooleanMethod(_jAdmobObject, jmethod);
+    }
+    catch (const notFound&)
+    {
+        log::error("jniAdmobLoad failed, class/member not found");
+    }
+}
+
+
+bool jniAdmobIsLoaded()
+{
+    if (!isAdmobEnabled())
+        return false;
+
+    bool result = false;
+    try
+    {
+        JNIEnv* env = jniGetEnv();
+        LOCAL_REF_HOLDER(env);
+        
+        jmethodID jisMethod = env->GetMethodID(_jAdmobClass, "isLoaded", "()Z");
+        JNI_NOT_NULL(jisMethod);
+        
+        jboolean jb = env->CallBooleanMethod(_jAdmobObject, jisMethod);
+        result = (bool) jb;
+
+    }
+    catch (const notFound&)
+    {
+        log::error("jniAdmobIsLoaded failed, class/member not found");
+    }
+
+    return result;
+}
+
 /*
 /*
 bool jniAdmobSomeBoolFunc()
 bool jniAdmobSomeBoolFunc()
     {
     {

+ 5 - 1
src/android/AndroidAdmob.h

@@ -5,4 +5,8 @@
 using namespace std;
 using namespace std;
 
 
 void jniAdmobInit();
 void jniAdmobInit();
-void jniAdmobFree();
+void jniAdmobFree();
+
+void jniAdmobShow();
+void jniAdmobLoad();
+bool jniAdmobIsLoaded();