- 浏览: 20594 次
- 性别:
- 来自: 北京
最新评论
1.导入头文件
2.详尽代码
调用非静态方法
java层代码被调用函数
转载至 :http://go3k.org/?p=49
http://www.himigame.com/android-game/725.html
#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
发表评论
-
cocos2dx 监听者模式
2013-09-02 10:29 969#ifndef __LuckyEgg_V2_1__Obse ... -
cocos2dx android下的环境搭建
2013-06-24 20:31 1819这玩意还是写下好,从 ... -
cocos2dx sqlite3封装使用
2013-06-09 12:01 3882DB.h /* * DB.h * * Cr ... -
cocos2dx 随机数
2013-05-24 14:56 1659int型随机数: #include <ctime&g ... -
cocos2dx 播放动画
2013-05-21 17:45 2778实现游戏里面可以播放动画的效果 可以实现播放一次和循环播放, ... -
cocos2dx CCHttpRequest联网
2013-05-21 13:25 2526使用CCHttprequest联网有两种方法get和post。 ... -
cocos2dx android游戏使用自己的字体
2013-05-21 13:05 1419怎样添加自己的.ttf文件到自己的android项目中呢?io ...
相关推荐
最后,在Cocos2d-x的C++代码中,我们可以调用`takePhoto`方法来启动照相机: ```cpp extern "C" { void Java_com_example_CameraService_takePhoto(); } void MyClass::startCamera() { JniMethodInfo t; if ...
在cocos2d-x项目中,对于Android平台,你需要编译生成.so动态链接库文件,这是为了支持C++代码与Java代码的交互。使用NDK进行交叉编译,将Webview相关的Java代码打包进.so库。之后,将生成的.so文件放入项目的jni...
在压缩包中的`net`文件可能包含了具体的代码示例或教程,用于演示如何在cocos2d-x中实现Socket通信。这些示例通常会涵盖Socket的创建、连接、数据传输以及错误处理等方面,对于初学者来说是非常有价值的参考资料。 ...
同时,cocos2d也支持Objective-C和Swift,适用于原生的iOS开发,以及Java和Kotlin,适用于Android开发。 在cocos2d的文件列表中,“cocos2d-master”可能是一个包含cocos2d源代码的主分支,这通常意味着用户可以...
Android Studio项目结构中,你需要在`build.gradle`文件中添加对Cocos2d-android的依赖,并在项目的`src`目录下创建相应的Java或C++源代码文件。 "FirstGame"这个名字暗示了这个压缩包可能包含了一个简单的示例游戏...
由于Cocos2d的底层是用C++编写的,Java接口通常通过JNI(Java Native Interface)调用,这可能会影响性能。因此,理解如何优化JNI调用和内存管理对于提高游戏性能至关重要。 **9. 社区支持和扩展** Cocos2d拥有活跃...
2. **C++支持**:由于cocos2d基于C++,因此源码中会包含JNI(Java Native Interface)接口,用于Java和C++代码间的交互。开发者可以通过JNI调用cocos2d的C++函数,实现游戏逻辑和性能敏感的部分。 3. **资源管理**...
此外,Cocos2d-x还支持lua脚本语言,通过Cocos2d-android.jar,开发者可以将lua脚本与Java代码相结合,实现灵活的游戏逻辑。同时,Cocos2d-x提供了一个丰富的物理引擎Box2D,可用于创建真实的物理效果,如碰撞检测和...
4. **编译链接**:cocos2d-x的构建系统会自动将C++代码与Java代码链接在一起,生成最终的APK。NDK编译器会处理C++代码,生成本地库,这些库将被嵌入到最终的应用中。 5. **调试与优化**:利用NDK的gdb工具,开发者...
10. **Android集成**:除了Cocos2d-x的核心游戏逻辑外,源码还涉及到Android特定的集成,如AndroidManifest.xml配置,Intent启动游戏,以及可能的JNI(Java Native Interface)交互,用于调用原生Android库。...
本主题聚焦于如何通过JNI(Java Native Interface)来实现在Cocos2d-x中调用Java层的函数,以及反之在Java层调用C++代码。下面我们将深入探讨这一技术。 JNI是Java平台的一部分,它为开发者提供了一种方式来编写...
在Android平台上进行游戏开发时,Cocos2d-x是一个广泛使用的开源2D游戏引擎,它支持多平台,包括iOS、Android、Windows等。本篇将详细介绍如何在Windows XP SP3环境下配置Android Cocos2d-x的开发环境。 首先,我们...
解压后,将目录添加到PATH环境变量中,这样可以在命令行中直接调用Cocos2d-x的工具。 对于Eclipse的安装,虽然Cocos2d-x官方推荐使用Visual Studio,但有些开发者可能更习惯Eclipse。你需要下载Eclipse IDE for ...
Cocos2d基于Python,但也有多个语言版本,如cocos2d-x支持C++,cocos2d-js支持JavaScript,以及cocos2d-java针对Android平台。它提供了丰富的功能,包括场景管理、动作与特效、物理引擎、精灵与图块地图、触摸事件...
1. **环境配置**:首先,你需要安装Java Development Kit (JDK)、Android Studio、Android SDK以及Cocos2d-x SDK。配置好Android NDK和NDK路径,确保项目能够正确编译和运行。 2. **项目创建与结构**:使用Cocos2d-...
可以使用JNI提供的函数来访问和操作Java对象,如`JNIEnv`指针,它可以访问和调用Java对象、方法、字段。 6. **编译与链接**:使用NDK的构建系统(如`ndk-build`或Gradle的`externalNativeBuild`配置)将C++代码编译...
- 配置系统环境变量,添加Cocos2D-X的根目录到`PATH`变量中,以便在命令行中调用Cocos2D-X的工具。 - 安装Python(如果尚未安装),因为Cocos2D-X的构建系统依赖于Python。 - 安装NDK(Android Native Development...
【cocos2d-x 2.1.4以后版本新建项目的方式】 自cocos2d-x v2.1.4版本起,官方引入了Python作为项目创建的主要工具,改变了以往的手动配置方式,使得项目创建更为自动化和跨平台。本文将详细介绍如何在cocos2d-x v...
3. **NDK**:Native Development Kit,用于处理原生代码,如cocos2d-x的C++部分。从Android开发者网站下载并解压。 4. **Cygwin**:提供一个类Unix的环境,使得在Windows上可以执行Linux命令。在配置cocos2d-x时,...
为了实现这一目标,Cocos2d-x 提供了一个平台抽象层(Platform Abstraction Layer, PAL),该层隐藏了不同平台之间的差异,使得开发者可以在高层次上进行编程。PAL 包括了文件系统访问、网络通信、输入设备处理等多...