2013-11-27 18:11:49 +08:00
|
|
|
#include <SFML/System.hpp>
|
|
|
|
#include <SFML/Window.hpp>
|
|
|
|
#include <SFML/Graphics.hpp>
|
|
|
|
#include <SFML/Audio.hpp>
|
|
|
|
#include <SFML/Network.hpp>
|
|
|
|
|
2015-10-21 17:11:35 +08:00
|
|
|
// Do we want to showcase direct JNI/NDK interaction?
|
|
|
|
// Undefine this to get real cross-platform code.
|
|
|
|
#define USE_JNI
|
2013-11-27 18:11:49 +08:00
|
|
|
|
2015-10-21 17:11:35 +08:00
|
|
|
#if defined(USE_JNI)
|
|
|
|
// These headers are only needed for direct NDK/JDK interaction
|
|
|
|
#include <jni.h>
|
|
|
|
#include <android/native_activity.h>
|
|
|
|
|
|
|
|
// Since we want to get the native activity from SFML, we'll have to use an
|
|
|
|
// extra header here:
|
|
|
|
#include <SFML/System/NativeActivity.hpp>
|
|
|
|
|
|
|
|
// NDK/JNI sub example - call Java code from native code
|
|
|
|
int vibrate(sf::Time duration)
|
|
|
|
{
|
|
|
|
// First we'll need the native activity handle
|
|
|
|
ANativeActivity *activity = sf::getNativeActivity();
|
|
|
|
|
|
|
|
// Retrieve the JVM and JNI environment
|
|
|
|
JavaVM* vm = activity->vm;
|
|
|
|
JNIEnv* env = activity->env;
|
|
|
|
|
|
|
|
// First, attach this thread to the main thread
|
|
|
|
JavaVMAttachArgs attachargs;
|
|
|
|
attachargs.version = JNI_VERSION_1_6;
|
|
|
|
attachargs.name = "NativeThread";
|
|
|
|
attachargs.group = NULL;
|
|
|
|
jint res = vm->AttachCurrentThread(&env, &attachargs);
|
|
|
|
|
|
|
|
if (res == JNI_ERR)
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
|
|
|
// Retrieve class information
|
|
|
|
jclass natact = env->FindClass("android/app/NativeActivity");
|
|
|
|
jclass context = env->FindClass("android/content/Context");
|
|
|
|
|
|
|
|
// Get the value of a constant
|
|
|
|
jfieldID fid = env->GetStaticFieldID(context, "VIBRATOR_SERVICE", "Ljava/lang/String;");
|
|
|
|
jobject svcstr = env->GetStaticObjectField(context, fid);
|
|
|
|
|
|
|
|
// Get the method 'getSystemService' and call it
|
|
|
|
jmethodID getss = env->GetMethodID(natact, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
|
|
|
|
jobject vib_obj = env->CallObjectMethod(activity->clazz, getss, svcstr);
|
|
|
|
|
|
|
|
// Get the object's class and retrieve the member name
|
|
|
|
jclass vib_cls = env->GetObjectClass(vib_obj);
|
|
|
|
jmethodID vibrate = env->GetMethodID(vib_cls, "vibrate", "(J)V");
|
|
|
|
|
|
|
|
// Determine the timeframe
|
|
|
|
jlong length = duration.asMilliseconds();
|
|
|
|
|
|
|
|
// Bzzz!
|
|
|
|
env->CallVoidMethod(vib_obj, vibrate, length);
|
|
|
|
|
|
|
|
// Free references
|
|
|
|
env->DeleteLocalRef(vib_obj);
|
|
|
|
env->DeleteLocalRef(vib_cls);
|
|
|
|
env->DeleteLocalRef(svcstr);
|
|
|
|
env->DeleteLocalRef(context);
|
|
|
|
env->DeleteLocalRef(natact);
|
|
|
|
|
|
|
|
// Detach thread again
|
|
|
|
vm->DetachCurrentThread();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// This is the actual Android example. You don't have to write any platform
|
|
|
|
// specific code, unless you want to use things not directly exposed.
|
|
|
|
// ('vibrate()' in this example; undefine 'USE_JNI' above to disable it)
|
2013-11-27 18:11:49 +08:00
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "");
|
|
|
|
|
|
|
|
sf::Texture texture;
|
|
|
|
if(!texture.loadFromFile("image.png"))
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
|
|
|
sf::Sprite image(texture);
|
|
|
|
image.setPosition(0, 0);
|
|
|
|
image.setOrigin(texture.getSize().x/2, texture.getSize().y/2);
|
|
|
|
|
|
|
|
sf::Music music;
|
|
|
|
if(!music.openFromFile("canary.wav"))
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
|
|
|
music.play();
|
|
|
|
|
2014-06-22 02:10:46 +08:00
|
|
|
sf::View view = window.getDefaultView();
|
|
|
|
|
2013-11-27 18:11:49 +08:00
|
|
|
while (window.isOpen())
|
|
|
|
{
|
|
|
|
sf::Event event;
|
|
|
|
|
|
|
|
while (window.pollEvent(event))
|
|
|
|
{
|
2015-10-21 17:11:35 +08:00
|
|
|
switch (event.type)
|
2014-06-22 02:10:46 +08:00
|
|
|
{
|
2015-10-21 17:11:35 +08:00
|
|
|
case sf::Event::Closed:
|
|
|
|
window.close();
|
|
|
|
break;
|
|
|
|
case sf::Event::Resized:
|
|
|
|
view.setSize(event.size.width, event.size.height);
|
|
|
|
view.setCenter(event.size.width/2, event.size.height/2);
|
|
|
|
window.setView(view);
|
|
|
|
break;
|
|
|
|
case sf::Event::TouchBegan:
|
|
|
|
if (event.touch.finger == 0)
|
|
|
|
{
|
|
|
|
image.setPosition(event.touch.x, event.touch.y);
|
|
|
|
#if defined(USE_JNI)
|
|
|
|
vibrate(sf::milliseconds(10));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
break;
|
2014-06-22 02:10:46 +08:00
|
|
|
}
|
2013-11-27 18:11:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
window.clear(sf::Color::White);
|
2015-04-01 10:08:23 +08:00
|
|
|
window.draw(image);
|
2013-11-27 18:11:49 +08:00
|
|
|
window.display();
|
|
|
|
}
|
|
|
|
}
|