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)