在这篇文章中,我们将带领您了解如何从Android到Java中的非静态函数进行正确调用?(混合中的Cocos2Dx)的全貌,包括java非静态方法调用的相关情况。同时,我们还将为您介绍有关关于coco
在这篇文章中,我们将带领您了解如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)的全貌,包括java非静态方法调用的相关情况。同时,我们还将为您介绍有关
- 如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)(java非静态方法调用)
关于cocos2dx接Android sdk的一些坑 - android-ndk – 从java(android)调用C(cocos2dx)方法进行我的应用内结算
- Android中的cocos2d游戏仅显示黑屏
- Bullet(Cocos2dx)之交叉编译Android,集成到cocos2dx3.x
如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)(java非静态方法调用)
– 创建主要活动的实例(environment-> NewGlobalRef是我正在使用的实例)
– 从活动中获取方法并执行它(environment-> GetobjectClass)
这是代码.在java中我们有以下内容(省略onCreate,onResume等逻辑内容):
public class TSP extends Cocos2dxActivity{ public void CnxAttempt(){ Log.e("TSP_BT","aTTEMPTING!"); } }
而已!就目前而言,我只想显示一条Log消息,确认该函数已执行.现在,有趣的部分是在C:
static jnienv* getjnienv(void){ jnienv *env = 0; // get jni environment if (gJavaVM->GetEnv((void**)&env,JNI_VERSION_1_4) != JNI_OK){ cclog("Failed to get the environment using GetEnv()"); } if (gJavaVM->AttachCurrentThread(&env,0) < 0){ cclog("Failed to get the environment using AttachCurrentThread()"); } return env; } typedef struct JniMethodInfo_{ jnienv * env; // The environment jclass classID; // classID jmethodID methodID; // methodID } JniMethodInfo; // Struct that stores most of the important information to relate to Java code static bool getmethodInfo(JniMethodInfo &methodinfo,const char *methodName,const char *paramCode){ jmethodID methodID = 0; jnienv *pEnv = 0; jobject methodobject = NULL; bool bRet = false; do { pEnv = getjnienv(); if (! pEnv){ cclog("getmethodInfo -- pEnv false"); break; } jclass localRef = pEnv->FindClass("org/cocos2dx/tsp/TSP"); if (localRef == NULL) { cclog("getmethodInfo -- localRefCls false"); break; // exception thrown } gCallbackObject = pEnv->NewGlobalRef(localRef); if (gCallbackObject == NULL){ cclog("getmethodInfo -- CallbackOBJ false"); break; } jclass classID = pEnv->GetobjectClass(methodobject); if (!classID){ cclog("getmethodInfo -- classID false"); break; } methodID = pEnv->getmethodID(classID,methodName,paramCode); if (!methodID){ cclog("getmethodInfo -- methodID false"); break; } methodinfo.classID = classID; methodinfo.env = pEnv; methodinfo.methodID = methodID; cclog("getmethodInfo -- methodinfo created"); bRet = true; } while(0); return bRet; } void CnxAttempt(){ JniMethodInfo methodInfo; // Creating a JniMethodInfo object to store all the data if (! getmethodInfo(methodInfo,"CnxAttempt","()V")){ cclog("getmethodInfo is FALSE :("); return; } methodInfo.env->CallVoidMethod(methodobject,methodInfo.methodID); methodInfo.env->DeleteLocalRef(methodInfo.classID); }
就是这样!在C上调用CnxAttempt时,它会转到BOOM,因为它无法识别java类中的方法而无法访问它…
有人可以帮我一把吗?如果不清楚,请告诉我.先谢谢了!
解决方法
Local references are valid for the duration of a native method call,and are automatically freed after the native method returns. Global references remain valid until they are explicitly freed.
如果要对对象调用非静态方法,则需要将对象传递给本机方法(如果存在 – 主活动是否应该存在?),使用NewObject *函数创建一个新方法,或者通过调用一些工厂方法.
然后获取对象的类对象,获取methodID然后调用该方法.
关于cocos2dx接Android sdk的一些坑
简单说说UI线程 :在Android中,有个非常重要的家伙非常霸道,那就是UI线程。这霸道之一:不能被阻塞。 之二:系统对每一个组件的调用都从UI线程分发出去。
简单说说openGL线程:但凡cocos2dx 启动的绘制线程都是openGL线程。就这么多
任何SDK界面的调用,必须从UI线程中调用,所以需要放到主线程中。如果我们直接从GL线程中调用,轻则调用不了,重者程序蹦死。
解决办法:
得到主线程的handler,这里简单说一种,就是在onCreate中new一个静态handler。
或者new Handler(Looper.getMainLooper()),且叫mainHandler吧,
启动一个线程,
- ThreadsendThread=newThread(newRunnable(){
- publicvoidrun(){
- mainHandler.post(sendRun);
- }
- });
android-ndk – 从java(android)调用C(cocos2dx)方法进行我的应用内结算
这是我通过jni调用我的java函数的方式.
JniMethodInfo t; JniHelper::getStaticmethodInfo(t,"com/test/project/Project","BuyProduct","(Ljava/lang/String;)V"); char buffer[20]; sprintf(buffer,"product1"); jstring StringArg1 = t.env->NewStringUTF(buffer); t.env->CallStaticVoidMethod(t.classID,t.methodID,StringArg1);
应用内结算工作正常,但现在我必须给我的c类打电话,告知产品购买是否成功.
我只能通过提到指定的返回类型返回调用方法的结果,但是应用程序内进程是一个异步进程 – 经过大量的方法调用,我的控件不会返回到同一个方法.所以返回一个值是行不通的.
那么有没有其他方法将值(在我的情况下是应用程序内购买的结果)从java函数传递给我的c类???
解决方法
基本上cocos2dxHelper.java中有一个方法只有定义而不是实现,通常它看起来像
public static native blahblah();
并且在cpp文件中有一个相应的函数被调用
Java_org_cocos2dx_cocos2dxHelper_blahblah()
如果你用runOnUIThread()调用Java代码中的blahblah(),那就是c函数
Java_org_cocos2dx_cocos2dxHelper_blahblah()
将被召唤.
顺便说一句,c代码需要在extern C {}中
Android中的cocos2d游戏仅显示黑屏
我有cocos2d iphone的经验,现在我想获得一些cocos2d android的经验.所以,我正在关注这个很好的教程
http://dan.clarke.name/2011/04/how-to-make-a-simple-android-game-with-cocos2d/
由于某种原因,我总是会出现黑屏.我想这是活动的名称.我是Android OS的新手,所以我几乎不了解它是如何工作的.无论如何,有没有经验丰富的将cocos2d与android结合使用的人见过类似的东西? Eclipse配置中是否缺少某些内容?
解决方法:
在cocos2d中进行编程的最佳方法是使用真实设备,仿真器太慢(<10fps)
顺便说说:
1º首先,启动Android模拟器.目标:与项目相同,如果目标不同,则无法正常工作(可能会变黑,仅在某些情况下会发生)
2º转到运行配置,然后选择与项目和仿真器相同的目标.
3º启动项目(如果模拟器已完全加载),然后等待.
4ºVoilá.
Bullet(Cocos2dx)之交叉编译Android,集成到cocos2dx3.x
首先将src文件夹复制到jni文件夹,没有可以新建一个
新建两个文件Android.mk,Application.mk
Application.mk内容如下:
APP_ABI:=armeabiarmeabi-v7ax86
APP_PLATFORM:=android-8
APP_STL:=stlport_static
Android.mk内容如下:
LOCAL_PATH:=$(callmy-dir)
include$(CLEAR_VARS)
LOCAL_MODULE :=bullet_static(可随便起)
LOCAL_MODULE_FILENAME:=libbullet(可随便起)
LOCAL_C_INCLUDES:=src/(头文件位置)
(源文件,要列出所有用到的,这里用到BulletSoftBodyBulletDynamics
BulletCollisionsLinearMath)
LOCAL_SRC_FILES := src/BulletSoftBody/btSoftBody.cpp\ src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp \ src/BulletSoftBody/btSoftBodyHelpers.cpp \ src/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp \ src/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp \ src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp \ src/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp \ src/BulletSoftBody/btDefaultSoftBodySolver.cpp \ src/BulletDynamics/Character/btKinematicCharacterController.cpp \ src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btFixedConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btGearConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp \ src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp \ src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp \ src/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.cpp \ src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp \ src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp \ src/BulletDynamics/Dynamics/btdiscreteDynamicsWorld.cpp \ src/BulletDynamics/Dynamics/btRigidBody.cpp \ src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp \ src/BulletDynamics/Vehicle/btRaycastVehicle.cpp \ src/BulletDynamics/Vehicle/btWheelInfo.cpp \ src/BulletDynamics/Featherstone/btMultiBody.cpp \ src/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp \ src/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.cpp \ src/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.cpp \ src/BulletDynamics/Featherstone/btMultiBodyConstraint.cpp \ src/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp \ src/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp \ src/BulletDynamics/MLcpsolvers/btDantzigLCP.cpp \ src/BulletDynamics/MLcpsolvers/btMLcpsolver.cpp \ src/BulletDynamics/MLcpsolvers/btLemkeAlgorithm.cpp \ src/BulletCollision/broadphaseCollision/btAxisSweep3.cpp \ src/BulletCollision/broadphaseCollision/btbroadphaseProxy.cpp \ src/BulletCollision/broadphaseCollision/btCollisionAlgorithm.cpp \ src/BulletCollision/broadphaseCollision/btDbvt.cpp \ src/BulletCollision/broadphaseCollision/btDbvtbroadphase.cpp \ src/BulletCollision/broadphaseCollision/btdispatcher.cpp \ src/BulletCollision/broadphaseCollision/btMultiSapbroadphase.cpp \ src/BulletCollision/broadphaseCollision/btOverlappingPairCache.cpp \ src/BulletCollision/broadphaseCollision/btQuantizedBvh.cpp \ src/BulletCollision/broadphaseCollision/btSimplebroadphase.cpp \ src/BulletCollision/Collisiondispatch/btActivatingCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btBoxBoxCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btBox2dBox2dCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btBoxBoxDetector.cpp \ src/BulletCollision/Collisiondispatch/btCollisiondispatcher.cpp \ src/BulletCollision/Collisiondispatch/btCollisionObject.cpp \ src/BulletCollision/Collisiondispatch/btCollisionWorld.cpp \ src/BulletCollision/Collisiondispatch/btCollisionWorldImporter.cpp \ src/BulletCollision/Collisiondispatch/btCompoundCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btCompoundCompoundCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btConvexConcaveCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btConvexConvexAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btConvexPlaneCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btConvex2dConvex2dAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btDefaultCollisionConfiguration.cpp \ src/BulletCollision/Collisiondispatch/btEmptyCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btGhostObject.cpp \ src/BulletCollision/Collisiondispatch/btHashedSimplePairCache.cpp \ src/BulletCollision/Collisiondispatch/btInternalEdgeUtility.cpp \ src/BulletCollision/Collisiondispatch/btManifoldResult.cpp \ src/BulletCollision/Collisiondispatch/btSimulationIslandManager.cpp \ src/BulletCollision/Collisiondispatch/btSphereBoxCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btSphereSphereCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btSphereTriangleCollisionAlgorithm.cpp \ src/BulletCollision/Collisiondispatch/btUnionFind.cpp \ src/BulletCollision/Collisiondispatch/SphereTriangleDetector.cpp \ src/BulletCollision/CollisionShapes/btBoxShape.cpp \ src/BulletCollision/CollisionShapes/btBox2dShape.cpp \ src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp \ src/BulletCollision/CollisionShapes/btCapsuleShape.cpp \ src/BulletCollision/CollisionShapes/btCollisionShape.cpp \ src/BulletCollision/CollisionShapes/btCompoundShape.cpp \ src/BulletCollision/CollisionShapes/btConcaveShape.cpp \ src/BulletCollision/CollisionShapes/btConeshape.cpp \ src/BulletCollision/CollisionShapes/btConvexHullShape.cpp \ src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp \ src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp \ src/BulletCollision/CollisionShapes/btConvexpolyhedron.cpp \ src/BulletCollision/CollisionShapes/btConvexShape.cpp \ src/BulletCollision/CollisionShapes/btConvex2dShape.cpp \ src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp \ src/BulletCollision/CollisionShapes/btCylinderShape.cpp \ src/BulletCollision/CollisionShapes/btEmptyShape.cpp \ src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp \ src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp \ src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp \ src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp \ src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp \ src/BulletCollision/CollisionShapes/btpolyhedralConvexShape.cpp \ src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp \ src/BulletCollision/CollisionShapes/btShapeHull.cpp \ src/BulletCollision/CollisionShapes/btSphereShape.cpp \ src/BulletCollision/CollisionShapes/btStaticPlaneshape.cpp \ src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp \ src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp \ src/BulletCollision/CollisionShapes/btTriangleBuffer.cpp \ src/BulletCollision/CollisionShapes/btTriangleCallback.cpp \ src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp \ src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp \ src/BulletCollision/CollisionShapes/btTriangleMesh.cpp \ src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp \ src/BulletCollision/CollisionShapes/btUniformScalingShape.cpp \ src/BulletCollision/Gimpact/btContactProcessing.cpp \ src/BulletCollision/Gimpact/btGenericPoolAllocator.cpp \ src/BulletCollision/Gimpact/btGImpactBvh.cpp \ src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp \ src/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp \ src/BulletCollision/Gimpact/btGImpactShape.cpp \ src/BulletCollision/Gimpact/btTriangleShapeEx.cpp \ src/BulletCollision/Gimpact/gim_Box_set.cpp \ src/BulletCollision/Gimpact/gim_contact.cpp \ src/BulletCollision/Gimpact/gim_memory.cpp \ src/BulletCollision/Gimpact/gim_tri_collision.cpp \ src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp \ src/BulletCollision/NarrowPhaseCollision/btConvexCast.cpp \ src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp \ src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp \ src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp \ src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp \ src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp \ src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp \ src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp \ src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp \ src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp \ src/BulletCollision/NarrowPhaseCollision/btpolyhedralContactClipping.cpp \ src/LinearMath/btAlignedAllocator.cpp \ src/LinearMath/btConvexHull.cpp \ src/LinearMath/btConvexHullComputer.cpp \ src/LinearMath/btGeometryUtil.cpp \ src/LinearMath/btPolarDecomposition.cpp \ src/LinearMath/btQuickprof.cpp \ src/LinearMath/btSerializer.cpp \ src/LinearMath/btVector3.cpp
最后还要加上一句,表示生成静态库如果将STATIC该文SHARED则生成动态库
include$(BUILD_STATIC_LIBRARY)
然后进入命令行
进入jni所在目录
ndk-build
等待编译完成
将三个目录下的libbullet.a分别复制到cocos2dx的安装目录下的
安装目录\Cocos\frameworks\cocos2d-x\prebuilt\android\相应文件下
进入Cocos\frameworks\cocos2d-x\external
新建文件夹Bullet,在Bullet下新建prebuild-mk
将Box2D\prebuild-mk下的Android.mk复制到Bullet/prebuild-mk
修改如下3行
LOCAL_MODULE:=bullet_static
LOCAL_MODULE_FILENAME:=libbullet
LOCAL_SRC_FILES:=../../../prebuilt/android/$(TARGET_ARCH_ABI)/libbullet.a
复制头文件
将bullet3的src的所有文件复制到新建的Bullet文件下
删除不是.h的所有文件
下一步任务繁重,
将所有用到BulletCollisionBulletDynamicsBulletSoftBodyLinearMath目录下的include都加上Bullet/,可以使用Notepad++在Bullet目录搜索Bullet,并替换为Bullet/Bullet,LinearMath并替换为Bullet/LinearMath
进入Cocos\frameworks\cocos2d-x\cocos\prebuilt-mk
在Android.mk
在LOCAL_WHOLE_STATIC_LIBRARIES+=Box2d_static下面添加
LOCAL_WHOLE_STATIC_LIBRARIES+=bullet_static
$(callimport-module,Box2D/prebuilt-mk)下面添加
$(callimport-module,Bullet/prebuilt-mk)
至此已经完成编译静态库
下载地址
关于如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)和java非静态方法调用的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于
本文标签: