Cocosd-x对Java进行调用的测试代码
来源:互联网 发布:制作授权书软件 编辑:程序博客网 时间:2024/04/29 23:32
原文转自 http://blog.csdn.net/stupidcodegenerator/article/details/8589613?userName=peigong_dh&userInfo=lJf%2FdZQt4QaoKL2KNtoZ72d1g5BD1EyTYKahykMLnhr%2BYsrhMsTEZQLMUOIKjUHRJ940%2BFGME%2BpPDfDvOgR%2BQ9EiUzPmmSqKBGoE0F1NVjHdLYsLolHB6FY6X6eVy1UHuyu2c7JUc5QcuFCWAmpxpw%3D%3D
目前计划是这样的, 首先, 在Java代码中写两个测试的函数,JniTestFunction_Static, JniTestFunction.
话说,在VIM还不熟练的时候使用VIM真的是降低效率思密达。VIM和Emacs还是得会一个,考虑到Stalllman的固执己见,我还是觉得VIM更体贴一些。
JniHelper.h中定义了一个结构体JniMethodInfo和一个类JniHelper. 代码如下:
- /****************************************************************************
- Copyright (c) 2010-2011 cocos2d-x.org
- http://www.cocos2d-x.org
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- #ifndef __ANDROID_JNI_HELPER_H__
- #define __ANDROID_JNI_HELPER_H__
- #include <jni.h>
- #include <string>
- #include "platform/CCPlatformMacros.h"
- NS_CC_BEGIN
- typedef struct JniMethodInfo_
- {
- // The env pointer is a structure that contains the interface to the
- // JVM. It includes all of the functions necessary to interact with
- // the JVM and to work with Java objects. Example JNI functions are
- // converting native arrays to/from Java arrays, converting native
- // strings to/from Java strings, instantiating objects, throwing
- // exceptions, etc. Basically, anything that Java code can do can be
- // done using JNIEnv, albeit with considerably less ease.
- // env指针是一个包含了JVM接口的指针。他包含了全部必要的用来和JVM进行通讯的函数。比如
- // 将本地数组转换成Java数组,将本地字符串转换成Java字符串,实例化对象,抛出异常等等。
- // 基本上,任何可以用Java代码实现的功能都可以通过JNIEnv实现,尽管实现的不是那么轻松。
- // A JNI interface pointer (JNIEnv*) is passed as an argument for each
- // native function mapped to a Java method, allowing for interaction
- // with the JNI environment within the native method. This JNI
- // interface pointer can be stored, but remains valid only in the
- // current thread. Other threads must first call AttachCurrentThread()
- // to attach themselves to the VM and obtain a JNI interface pointer.
- // Once attached, a native thread works like a regular Java thread
- // running within a native method. The native thread remains attached
- // to the VM until it calls DetachCurrentThread() to detach itself.[4]
- // JNI interface pointer (JNIEnv*) 在每一个对应于Java函数的Native函数中都作为
- // 一个参数传入,这样做可以让JNI环境和Native函数进行沟通。这个JNI接口会被储存,但是
- // 只有在当前线程中有效。其他的线程必须首先调用AttachCurrentThread()来将他们自己
- // 附到VM上并且获取一个JNIEnv.一旦附属到VM上,一个Native线程就会像一个Java线程那样
- // 运行。本地线程会保持附属直到调用DetachCurrentThread().
- // 参见 jni.h
- JNIEnv * env;
- jclass classID;
- jmethodID methodID;
- } JniMethodInfo;
- class CC_DLL JniHelper
- {
- public:
- static JavaVM* getJavaVM();
- static void setJavaVM(JavaVM *javaVM);
- static jclass getClassID(const char *className, JNIEnv *env=0);
- 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);
- static std::string jstring2string(jstring str);
- private:
- static JavaVM *m_psJavaVM;
- };
- NS_CC_END
- #endif // __ANDROID_JNI_HELPER_H__
现在我定义一个JniMethodInfo. 然后用getStaticMethodInfo来尝试获得Java里面的jniTestFunction_Static的函数信息
写道HelloWorldScene.cpp中
- #include "HelloWorldScene.h"
- #include "SimpleAudioEngine.h"
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
- #include <jni.h>
- #include "platform/android/jni/JniHelper.h"
- #include <android/log.h>
- #endif
- using namespace cocos2d;
- using namespace CocosDenshion;
- CCScene* HelloWorld::scene()
- {
- // 'scene' is an autorelease object
- CCScene *scene = CCScene::create();
- // 'layer' is an autorelease object
- HelloWorld *layer = HelloWorld::create();
- // add layer as a child to scene
- scene->addChild(layer);
- // return the scene
- return scene;
- }
- // on "init" you need to initialize your instance
- bool HelloWorld::init()
- {
- //////////////////////////////
- // 1. super init first
- if ( !CCLayer::init() )
- {
- return false;
- }
- /////////////////////////////
- // 2. add a menu item with "X" image, which is clicked to quit the program
- // you may modify it.
- // add a "close" icon to exit the progress. it's an autorelease object
- CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- this,
- menu_selector(HelloWorld::menuCloseCallback) );
- pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) );
- // create menu, it's an autorelease object
- CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
- pMenu->setPosition( CCPointZero );
- this->addChild(pMenu, 1);
- /////////////////////////////
- // 3. add your codes below...
- // add a label shows "Hello World"
- // create and initialize a label
- CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Thonburi", 34);
- // ask director the window size
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- // position the label on the center of the screen
- pLabel->setPosition( ccp(size.width / 2, size.height - 20) );
- // add the label as a child to this layer
- this->addChild(pLabel, 1);
- // add "HelloWorld" splash screen"
- CCSprite* pSprite = CCSprite::create("HelloWorld.png");
- // position the sprite on the center of the screen
- pSprite->setPosition( ccp(size.width/2, size.height/2) );
- // add the sprite as a child to this layer
- this->addChild(pSprite, 0);
- // JNI call test
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
- JniMethodInfo minfo;//定义Jni函数信息结构体
- //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
- bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/chen/FuckAndroid","JniTestFunction_Static", "()V");
- if (!isHave) {
- CCLog("jni:此函数不存在");
- }else{
- CCLog("jni:此函数存在");
- //调用此函数
- minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
- }
- CCLog("jni-java函数执行完毕");
- #endif
- return true;
- }
- void HelloWorld::menuCloseCallback(CCObject* pSender)
- {
- CCDirector::sharedDirector()->end();
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
- exit(0);
- #endif
- }
调用的方法在com.chen.FuckAndroid.java中
- /****************************************************************************
- Copyright (c) 2010-2012 cocos2d-x.org
- http://www.cocos2d-x.org
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- package com.chen;
- import org.cocos2dx.lib.Cocos2dxActivity;
- import org.cocos2dx.lib.Cocos2dxEditText;
- import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
- import org.cocos2dx.lib.Cocos2dxRenderer;
- import android.app.ActivityManager;
- import android.content.Context;
- import android.content.pm.ConfigurationInfo;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.FrameLayout;
- import android.view.ViewGroup;
- public class FuckAndroid extends Cocos2dxActivity{
- protected void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- if (detectOpenGLES20()) {
- // get the packageName,it's used to set the resource path
- String packageName = getApplication().getPackageName();
- super.setPackageName(packageName);
- // FrameLayout
- ViewGroup.LayoutParams framelayout_params =
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT);
- FrameLayout framelayout = new FrameLayout(this);
- framelayout.setLayoutParams(framelayout_params);
- // Cocos2dxEditText layout
- ViewGroup.LayoutParams edittext_layout_params =
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
- Cocos2dxEditText edittext = new Cocos2dxEditText(this);
- edittext.setLayoutParams(edittext_layout_params);
- // ...add to FrameLayout
- framelayout.addView(edittext);
- // Cocos2dxGLSurfaceView
- mGLView = new Cocos2dxGLSurfaceView(this);
- // ...add to FrameLayout
- framelayout.addView(mGLView);
- mGLView.setEGLContextClientVersion(2);
- mGLView.setCocos2dxRenderer(new Cocos2dxRenderer());
- mGLView.setTextField(edittext);
- // Set framelayout as the content view
- setContentView(framelayout);
- }
- else {
- Log.d("activity", "don't support gles2.0");
- finish();
- }
- }
- @Override
- protected void onPause() {
- super.onPause();
- mGLView.onPause();
- }
- @Override
- protected void onResume() {
- super.onResume();
- mGLView.onResume();
- }
- private boolean detectOpenGLES20()
- {
- ActivityManager am =
- (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
- ConfigurationInfo info = am.getDeviceConfigurationInfo();
- return (info.reqGlEsVersion >= 0x20000);
- }
- //////////////////////////
- // These functions will be called by C++ code
- public static void JniTestFunction_Static(){
- System.out.println("JniTestFunction_Static_Called");
- }
- public void JniTestFunction(){
- System.out.println("JniTestFunction_Called");
- }
- /////////////////////////
- static {
- System.loadLibrary("game");
- }
- }
调用结果:
0 0
- Cocosd-x对Java进行调用的测试代码
- 开始编写Cocosd-x对Java进行调用的测试代码
- Cocosd-x Android工程中C++调用Java和Java调用C++的不同
- 我对XCode之Cocosd-x工程项目的理解
- Cocos2d-x中通过JNI进行C++调用Java代码
- Cocos2d-x中通过JNI进行C++调用Java代码
- Cocos2d-x中通过JNI进行C++调用Java代码
- Cocos2d-x中通过JNI进行C++调用Java代码
- Cocos2d-x中通过JNI进行C++调用Java代码
- Cocos2d-x中通过JNI进行C++调用Java代码
- Cocos2d-x中通过JNI进行C++调用Java代码
- cocosd-x教程4 CCTextFieldTTF的使用
- cocosd-x 切换场景的方法
- Cocos2d-x中通过JNI进行C++调用Java代码 JniHelper类的使用
- 调用JAVA API对HDFS文件进行文件的读写、上传下载、删除等操作代码详解
- EMMA对功能测试进行代码覆盖率的统计
- 初学Cocosd-x,添加一个小图片,并把它缩小,旋转,移动,的代码(用的是c++)
- cocosd-x 内存管理
- tcpcopy-0.6.5的使用
- 北大计算机研究生的ACM感言
- 游戏架构 游戏架构设计(7)
- Linux查看日志
- 学长们的求职血泪史(C/C++/JAVA)
- Cocosd-x对Java进行调用的测试代码
- 游戏架构 游戏架构设计(8)
- WINCE 获取第一个SD卡
- ORA-00979: not a GROUP BY expression报错处理
- poj 3658 二分枚举答案。
- WindowsPhone 中 根据公历 获取农历日期数据
- 4. Java 2 SE 方法重写 & 多态
- Leetcode_palindrome-partitioning
- 第五届蓝桥杯初赛-切面条