cocos2d-x获取android手机震动

1.添加手机权限,打开:项目目录\proj.android\AndroidManifest.xml

添加以下代码:

        <uses-permission android:name="android.permission.VIBRATE"/>


2. 添加java代码,打开:项目目录\cocos2d\cocos\platform\android\java\src\org\cocos2dx\lib\Cocos2dxHelper.java

添加以下代码:

        import android.os.Vibrator;     //导入所需包

        public static void vibrate(int times) {    //获取系统震动接口并调用

Vibrator v = (Vibrator)sActivity.getSystemService(Context.VIBRATOR_SERVICE);

v.vibrate(times);

        }

3.在cpp中添加代码:

添加头文件:

        #if CC_PLATFORM_ANDROID == CC_TARGET_PLATFORM
        #include <jni.h>
        #include "platform/android/jni/JniHelper.h"
        #define CLASS_NAME "org/cocos2dx/lib/Cocos2dxHelper"

        #endif


需要调用的地方添加代码:

        #if CC_PLATFORM_ANDROID == CC_TARGET_PLATFORM
JniMethodInfo m;
if (JniHelper::getStaticMethodInfo(m, CLASS_NAME, "vibrate", "(I)V")) {
m.env->CallStaticVoidMethod(m.classID, m.methodID, 500);    //500是震动的时间
m.env->DeleteLocalRef(m.classID);
}

        #endif


以上的具体解释:

主体思路通过JNI获取java虚拟机,再获取当前程序的JNI环境,通过JNI环境获取需要调用的java类信息,再获取需要调用的java类中的函数信息。再通过JNI环境调用,使用类信息、函数信息,调用对应的java函数。

JniHelper类的使用,加入如下头文件:
#include "platform/android/jni/JniHelper.h"
需要使用的这两个接口,就可以获取java类的所有函数信息了。JNI环境的获取、各种错误处理都已经在这两个接口实现中封装好了。

static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);


static bool getMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);

参数详解:
两个接口的参数一样,意义也相同,详解如下:
JniMethodInfo &methodinfo JniMethodInfo对象的引用,函数执行中会把jniEvn、classid、methodid写入到引用中。
const char *className 类的路径
const char *methodName 函数名

const char *paramCode 函数类型简写:它的格式为:(参数)返回类型。例如:无参数,void返回类型函数,其简写为 ()V


java中的类型对应的简写如下:
参数类型 参数简写
boolean Z
byte         B
char         C
short S
int I
long         J
float         F
double D
void         V
Object Ljava/lang/String; //必须带分号
Array [Ljava/lang/String; //必须带分号

如果函数有多个参数,直接把简写并列即可。注意Object与Array型参数简写结尾的分号,示例:
void(int x1, int x2, int x3,int 4) (IIII)V 
void((int x, String a, int y) (ILjava/lang/String;I)V

JNIEvn有一系列的CallStatic[返回类型]Method、Call[返回类型]Method接口,需要针对不同的函数返回类型选择调用。
[返回类型]以函数返回类型的不同,对应不同的函数名。
例如:
CallStaticVoidMethod ———void
CallVoidMethod ———void
其对应关系如下:

函数名 函数返回值类型
Void         void
Object jobject
Boolean jboolean
Byte         jbyte
Char         jchar
Short jshort
Int         jint
Long jlong
Float         jfloat

Double jdouble

调用有参数的java函数时,需要把对应的参数传递进去。需要把参数按顺序加入到classid、methodid后面,并且需要做类型转换。例如:

jint jX = 10;
jint jY = 10;
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, jX, jY);


参数类型转换关系如下:

C++类型     JAVA类型
boolean     jboolean
byte     jbyte
char     jchar
short     jshort
int     jint
long     jlong
float     jfloat
double     jdouble
Object     jobject
Class     jclass
String     jstring
Object[]     jobjectArray
boolean[]     jbooleanArray
byte[]     jbyteArray
char[]     jcharArray
short[]     jshortArray
int[]     jintArray
long[]     jlongArray
float[]     jfloatArray
double[]     jdoubleArray

string类型的转换

实际上我们最常用的参数类型:内建的数据类型、string字符串类型。

数据类型可以直接转为j类型,但是string类型需要做如下处理:

jstring jmsg = minfo.env->NewStringUTF("http://www.baidu.com");
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, jmsg);


详尽的示例代码
最后,放一块比较详细的JNI使用代码,基本上覆盖了的全部使用情况。
    JniMethodInfo minfo;//JniHelper   
    /* 测试用方法 */ 
    bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","loginGree", "()V"); 
     if (isHave) {
         //CCLog("有showText ");
         minfo.env -> CallStaticVoidMethod(minfo.classID,minfo.methodID);
     } else  {
         //CCLog("没有方法showText");
     }

    /* 分享 */
    //将c++中的string转换成java中的string

    char str[] = "test";

    bool isHava = JniHelper::getStaticMethodInfo(minfo, "com/cocoa/HiWorld", "shareSina", "(Ljava/lang/String;)V")

     if ( isHave ) {
         jstring jstr = minfo.env->NewStringUTF("test1 share");
         minfo.env -> CallStaticVoidMethod(minfo.classID, minfo.methodID, jstr);
     } else {
         CCLog("没有方法share");

     }

    /* 设置高分 */
    jint ind = 0;
    jlong lsre = 2202l;
    bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","setHighScore", "(IJ)V"); 
     if (isHave) {
         minfo.env -> CallStaticVoidMethod(minfo.classID, minfo.methodID, ind, lsre);            

     }

    /* 测试用方法,非静态无参数无返回值方法 */
    isHave = JniHelper::getMethodInfo(minfo,"com/cocoa/HiWorld","showText", "()V"); 
     if ( isHave ) {
         minfo.env -> CallVoidMethod(jobj,minfo.methodID);

     }

    /* 测试用方法,无返回类型,有java类型的int[]和int参数方法 */
    isHave = JniHelper::getMethodInfo(minfo,"com/cocoa/HiWorld","testArr", "([II)V"); 
     if ( isHave ) {
         jint buf[]={7,5,8,9,3};
         jintArray jintArr;     //定义jint数组
         jintArr = minfo.env->NewIntArray(5);
         minfo.env->SetIntArrayRegion(jintArr,0,5,buf);
         jint index = 0;
         minfo.env -> CallVoidMethod(jobj,minfo.methodID,jintArr,index);
     }

    /* 测试用方法,无返回类型,有java类型的byte[]和int参数方法 */
    isHave = JniHelper::getMethodInfo(minfo,"com/cocoa/HiWorld","testArr", "([BI)V"); 
    if (isHave) {
        jbyte buf[]={7,5,8,9,3};
        jbyteArray jbyteArr; //定义jbyte数组
        jbyteArr = minfo.env->NewByteArray(5);
        minfo.env->SetByteArrayRegion(jbyteArr,0,5,buf);
        jint index = 0;
        minfo.env -> CallVoidMethod(jobj,minfo.methodID,jbyteArr,index);

    }

    private static HiWorld hiWorld = null;
    // c++中調用的方法

    public static Object rtnActivity()

    // c++中調用的方法,传String类型

    public void showText(final String msg) 

    //c++中調用的方法,传String类型和int类型
    public String showText(final String msg,final int index) { 
        return "okey String showText(final String msg,final int index)";

    }

    //c++中調用的方法,传String[]类型和int类型
    public String[] showText(final String[] msg,final int index) { 
        String[] strArr;
        return strArr;

    }

    //c++中調用的方法,传int[]类型和int类型
    public void testArr(final int msg[],final int index)

    //c++中調用的方法,传int[]类型和int类型
    public void testArr(final byte msg[],final int index)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值