`
zhuangshuo
  • 浏览: 20594 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cocos2dx 调用java层代码

阅读更多
1.导入头文件
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "android/log.h"
#include "platform/android/jni/JniHelper.h"
#endif



2.详尽代码
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 isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","shareSina", "(Ljava/lang/String;Ljava/lang/String;)V"); //
     if (isHave) {
     //CCLog("有share ");
     jstring jstr = minfo.env->NewStringUTF("test1 share");
     jstring jst = minfo.env->NewStringUTF("/data/data/com.cocoa/cy.png"); 
     //jstring jst = minfo.env->NewStringUTF("");
     minfo.env -> CallStaticVoidMethod(minfo.classID,minfo.methodID,jstr,jst);
     }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);            
     }*/
    /* 成就解锁 */
    /*jint aind = 0;
     bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","unLock", "(I)V"); 
     if (isHave) {
     minfo.env -> CallStaticVoidMethod(minfo.classID,minfo.methodID,aind);            
     }*/
    /* 测试用方法 */ 
    bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/cocoa/HiWorld","rtnActivity","()Ljava/lang/Object;");
    jobject jobj;
    if (isHave) { 
        jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID); 
    }       
    //CCLog(" jobj存在"); 
    /* 测试用方法,非静态无参数无返回值方法 */
    /*isHave = JniHelper::getMethodInfo(minfo,"com/cocoa/HiWorld","showText", "()V"); 
     if (isHave) {
     minfo.env -> CallVoidMethod(jobj,minfo.methodID);
     }*/
    /* 测试用方法,非静态有java类型的String参数无返回值方法 */
    /*isHave = JniHelper::getMethodInfo(minfo,"com/cocoa/HiWorld","showText", "(Ljava/lang/String;)V"); 
     if (isHave) {
     jstring jmsg = minfo.env->NewStringUTF("msg okey!");
     minfo.env -> CallVoidMethod(jobj,minfo.methodID,jmsg);
     }*/
    /* 测试用方法,返回java类型的String,有java类型的String和int参数方法 */
    /*isHave = JniHelper::getMethodInfo(minfo,"com/cocoa/HiWorld","showText", "(Ljava/lang/String;I)Ljava/lang/String;"); 
     if (isHave) {
     jstring jmsg = minfo.env->NewStringUTF("msg okey! return string");
     jint index = 0;
     minfo.env -> CallObjectMethod(jobj,minfo.methodID,jmsg,index);
     }*/
    /* 测试用方法,返回java类型的String[],有java类型的String[]和int参数方法 */
    /*isHave = JniHelper::getMethodInfo(minfo,"com/cocoa/HiWorld","showText", "([Ljava/lang/String;I)[Ljava/lang/String;"); 
     if (isHave) {
     jobjectArray args = 0;
     jstring str;
     jsize len = 5;
     const char* sa[] = {"Hi,","World!","JNI ","is ","fun"};
     int i = 0;
     args = minfo.env->NewObjectArray(len,minfo.env->FindClass("java/lang/String"),0);
     for(i=0;iNewStringUTF(sa[i]);
     minfo.env->SetObjectArrayElement(args,i,str);
     }
     //minfo.env->GetStringArrayRegion(args,0,10,buf);
     //jintArray jmsg = {1,2,3};
     //minfo.env->NewStringUTF("msg okey! return string");
     jint index = 0;
     minfo.env -> CallObjectMethod(jobj,minfo.methodID,args,index);
     }*/
    /* 测试用方法,无返回类型,有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;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    hiWorld = this;
    if (detectOpenGLES20()) {
        // get the packageName,it's used to set the resource path
        String packageName = getApplication().getPackageName();
        super.setPackageName(packageName);
        // set content
        setContentView(R.layout.game_demo);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
                                  R.layout.window_title);

        mGLView = (Cocos2dxGLSurfaceView) findViewById(R.id.game_gl_surfaceview);
        mGLView.setTextField((Cocos2dxEditText) findViewById(R.id.textField));
        mGLView.setEGLContextClientVersion(2);
        mGLView.setCocos2dxRenderer(new Cocos2dxRenderer());
        task = new TimerTask() {
            @Override
            public void run() {
                // HiWorld.shoot(hiWorld);
                Log.e("-------------------", "-------------------");
                // 调用c++中的方法
                System.out.println("------------------------"
                                   + stringZjy1());
            }
        };
        timer = new Timer();
        timer.schedule(task, 5000);
    } else {
        Log.d("activity", "don't support gles2.0");
        finish();
    }

    static {
        System.loadLibrary("game");
    }

    // c++中調用的方法
    public static Object rtnActivity() {
        System.out.println("----------rtnActivity");
        return hiWorld;
    }

    // c++中調用的方法,传String类型
    public void showText(final String msg) { 
        // 添加到主线程
        hiWorld.runOnUiThread(new Runnable() {
            public void run() { 
                System.out.println("----------msg:"+msg);
            }
        });
    }
    //c++中調用的方法,传String类型和int类型
    public String showText(final String msg,final int index) { 
        // 添加到主线程
        hiWorld.runOnUiThread(new Runnable() {
            public void run() { 
                System.out.println("----------msg:"+msg+"; index="+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 = {"1","2","3","4","5"};
        // 添加到主线程
        hiWorld.runOnUiThread(new Runnable() {
            public void run() { 
                for(String _str:msg){
                    System.out.println("----------String[] msg:"+_str+"; index="+index);
                }
            }
        });
        return strArr;
    }
    //c++中調用的方法,传int[]类型和int类型
    public void testArr(final int msg[],final int index) { 
        // 添加到主线程
        hiWorld.runOnUiThread(new Runnable() {
            public void run() { 
                System.out.println("----------int[] msg len:"+msg.length);
                for(int _bl:msg){
                    System.out.println("----------int[] msg:"+_bl+"; index="+index);
                }
            }
        });
    }
    //c++中調用的方法,传int[]类型和int类型
    public void testArr(final byte msg[],final int index) { 
        // 添加到主线程
        hiWorld.runOnUiThread(new Runnable() {
            public void run() { 
                System.out.println("----------byte[] msg len:"+msg.length);
                for(int _bl:msg){
                    System.out.println("----------byte[] msg:"+_bl+"; index="+index);
                }
            }
        });
    }


调用非静态方法

	JniMethodInfo minfo;//定义Jni函数信息结构体
	    //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
	    bool isHave = JniHelper::getStaticMethodInfo(minfo,
	                                                "com/cocos/animation/animation",  //类的路径
	                                                "rtnActivity",   //方法名
	                                                "()Ljava/lang/Object;");   //括号里的是参数,后面的是返回值。
	    jobject jobj;
	    if (isHave) {
	       jobj =minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);

	       CCLog("jobj :%x",jobj);
	    }
	    CCLog("正确获取到 jobj");

	    //
	    isHave = JniHelper::getMethodInfo(minfo,
	                                      "com/cocos/animation/animation",  //类的路径
	                                      "nostaticFun",   //方法名
	                                      "(Ljava/lang/String;)V");   //括号里的是参数,后面的是返回值。

	    if (isHave) {
	    	jstring jmsg=minfo.env->NewStringUTF("伊莎贝拉    SB鑫,Sb  Sb  还是SB");
	         minfo.env->CallVoidMethod(jobj, minfo.methodID,jmsg);
	    }
	     CCLog("jni-java函数执行完毕");



java层代码被调用函数

//---- 函数示例之非静态函数调用
  //(先获取个对象)
  public static Activity actInstance=new animation();//定义单例
  public static Object rtnActivity() {
      return actInstance;
  }
  //使用此对象进行调用非静态函数
  public void nostaticFun(String str) {
      Log.e("Himi", "no static Function is OK - By Himi:str="+str);

      StatusesAPI api=new StatusesAPI(animation.accessToken);

      /*api.update(str, "90.00","90.00",new RequestListener() {
		
		@Override
		public void onIOException(IOException arg0) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onError(WeiboException arg0) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onComplete(String arg0) {
			// TODO Auto-generated method stub
//			Toast.makeText(animation.this, "分享成功", Toast.LENGTH_SHORT).show();
		}
	});*/
      
      api.upload(str,"/sdcard/33.jpg", "90.00", "90.00", new RequestListener() {
		
		@Override
		public void onIOException(IOException arg0) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onError(WeiboException arg0) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onComplete(String arg0) {
			// TODO Auto-generated method stub
//			Toast.makeText(animation.this, "分享图片成功", Toast.LENGTH_SHORT).show();
		}
	});
  }




转载至 :http://go3k.org/?p=49
         http://www.himigame.com/android-game/725.html
分享到:
评论

相关推荐

    cocos2d3.0调用android原生态的照相机功能

    最后,在Cocos2d-x的C++代码中,我们可以调用`takePhoto`方法来启动照相机: ```cpp extern "C" { void Java_com_example_CameraService_takePhoto(); } void MyClass::startCamera() { JniMethodInfo t; if ...

    cocos2d-x嵌入webview

    在cocos2d-x项目中,对于Android平台,你需要编译生成.so动态链接库文件,这是为了支持C++代码与Java代码的交互。使用NDK进行交叉编译,将Webview相关的Java代码打包进.so库。之后,将生成的.so文件放入项目的jni...

    cocos2d-x+socket

    在压缩包中的`net`文件可能包含了具体的代码示例或教程,用于演示如何在cocos2d-x中实现Socket通信。这些示例通常会涵盖Socket的创建、连接、数据传输以及错误处理等方面,对于初学者来说是非常有价值的参考资料。 ...

    cocos2d游戏引擎

    同时,cocos2d也支持Objective-C和Swift,适用于原生的iOS开发,以及Java和Kotlin,适用于Android开发。 在cocos2d的文件列表中,“cocos2d-master”可能是一个包含cocos2d源代码的主分支,这通常意味着用户可以...

    cocos2d-android 基础代码

    Android Studio项目结构中,你需要在`build.gradle`文件中添加对Cocos2d-android的依赖,并在项目的`src`目录下创建相应的Java或C++源代码文件。 "FirstGame"这个名字暗示了这个压缩包可能包含了一个简单的示例游戏...

    cocos2d的jar包

    由于Cocos2d的底层是用C++编写的,Java接口通常通过JNI(Java Native Interface)调用,这可能会影响性能。因此,理解如何优化JNI调用和内存管理对于提高游戏性能至关重要。 **9. 社区支持和扩展** Cocos2d拥有活跃...

    cocos2d-Android项目源码

    2. **C++支持**:由于cocos2d基于C++,因此源码中会包含JNI(Java Native Interface)接口,用于Java和C++代码间的交互。开发者可以通过JNI调用cocos2d的C++函数,实现游戏逻辑和性能敏感的部分。 3. **资源管理**...

    cocos2d-android.zip_android_android Cocos2d.jar_cocos2d android.

    此外,Cocos2d-x还支持lua脚本语言,通过Cocos2d-android.jar,开发者可以将lua脚本与Java代码相结合,实现灵活的游戏逻辑。同时,Cocos2d-x提供了一个丰富的物理引擎Box2D,可用于创建真实的物理效果,如碰撞检测和...

    cocos2d-xaaNDK.rar_NDK_cocos2d_cocos2d game

    4. **编译链接**:cocos2d-x的构建系统会自动将C++代码与Java代码链接在一起,生成最终的APK。NDK编译器会处理C++代码,生成本地库,这些库将被嵌入到最终的应用中。 5. **调试与优化**:利用NDK的gdb工具,开发者...

    Cocos2d-x跑酷(StarterKit)游戏源码

    10. **Android集成**:除了Cocos2d-x的核心游戏逻辑外,源码还涉及到Android特定的集成,如AndroidManifest.xml配置,Intent启动游戏,以及可能的JNI(Java Native Interface)交互,用于调用原生Android库。...

    cocos2d-x 通过JNI实现c/c++和Android的java层函数互调-源码

    本主题聚焦于如何通过JNI(Java Native Interface)来实现在Cocos2d-x中调用Java层的函数,以及反之在Java层调用C++代码。下面我们将深入探讨这一技术。 JNI是Java平台的一部分,它为开发者提供了一种方式来编写...

    Android Cocos2d-x 环境配置

    在Android平台上进行游戏开发时,Cocos2d-x是一个广泛使用的开源2D游戏引擎,它支持多平台,包括iOS、Android、Windows等。本篇将详细介绍如何在Windows XP SP3环境下配置Android Cocos2d-x的开发环境。 首先,我们...

    cocos2d-x-android环境搭建文档

    解压后,将目录添加到PATH环境变量中,这样可以在命令行中直接调用Cocos2d-x的工具。 对于Eclipse的安装,虽然Cocos2d-x官方推荐使用Visual Studio,但有些开发者可能更习惯Eclipse。你需要下载Eclipse IDE for ...

    cocos2d-android-1资源:API文档

    Cocos2d基于Python,但也有多个语言版本,如cocos2d-x支持C++,cocos2d-js支持JavaScript,以及cocos2d-java针对Android平台。它提供了丰富的功能,包括场景管理、动作与特效、物理引擎、精灵与图块地图、触摸事件...

    Cocos2d Android的小游戏打飞机

    1. **环境配置**:首先,你需要安装Java Development Kit (JDK)、Android Studio、Android SDK以及Cocos2d-x SDK。配置好Android NDK和NDK路径,确保项目能够正确编译和运行。 2. **项目创建与结构**:使用Cocos2d-...

    JNI(c++与Java互调)cocos2d-x_3.x和android studio 3.0

    可以使用JNI提供的函数来访问和操作Java对象,如`JNIEnv`指针,它可以访问和调用Java对象、方法、字段。 6. **编译与链接**:使用NDK的构建系统(如`ndk-build`或Gradle的`externalNativeBuild`配置)将C++代码编译...

    第四课:Cocos2D-X跨平台开发环境搭建(win32)

    - 配置系统环境变量,添加Cocos2D-X的根目录到`PATH`变量中,以便在命令行中调用Cocos2D-X的工具。 - 安装Python(如果尚未安装),因为Cocos2D-X的构建系统依赖于Python。 - 安装NDK(Android Native Development...

    cocos2d-x 2.1.4以后版本新建项目的方式

    【cocos2d-x 2.1.4以后版本新建项目的方式】 自cocos2d-x v2.1.4版本起,官方引入了Python作为项目创建的主要工具,改变了以往的手动配置方式,使得项目创建更为自动化和跨平台。本文将详细介绍如何在cocos2d-x v...

    cocos2d-x配置教程,主要关于移植android

    3. **NDK**:Native Development Kit,用于处理原生代码,如cocos2d-x的C++部分。从Android开发者网站下载并解压。 4. **Cygwin**:提供一个类Unix的环境,使得在Windows上可以执行Linux命令。在配置cocos2d-x时,...

    cocos2d-x手机游戏开发 跨iOS、Android和沃Phone平台

    为了实现这一目标,Cocos2d-x 提供了一个平台抽象层(Platform Abstraction Layer, PAL),该层隐藏了不同平台之间的差异,使得开发者可以在高层次上进行编程。PAL 包括了文件系统访问、网络通信、输入设备处理等多...

Global site tag (gtag.js) - Google Analytics