www.91084.com

GVKun编程网logo

如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)(java非静态方法调用)

13

在这篇文章中,我们将带领您了解如何从Android到Java中的非静态函数进行正确调用?(混合中的Cocos2Dx)的全貌,包括java非静态方法调用的相关情况。同时,我们还将为您介绍有关关于coco

在这篇文章中,我们将带领您了解如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)的全貌,包括java非静态方法调用的相关情况。同时,我们还将为您介绍有关 关于cocos2dx接Android sdk的一些坑、android-ndk – 从java(android)调用C(cocos2dx)方法进行我的应用内结算、Android中的cocos2d游戏仅显示黑屏、Bullet(Cocos2dx)之交叉编译Android,集成到cocos2dx3.x的知识,以帮助您更好地理解这个主题。

本文目录一览:

如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)(java非静态方法调用)

如何从Android到Java中的非静态函数进行正确调用? (混合中的Cocos2Dx)(java非静态方法调用)

所以我正在用Cocos2Dx开发一个小项目,但我正在尝试添加蓝牙功能,这意味着调用非静态方法可以访问Main Activity与 Android API的关联.我见过的几乎所有内容都告诉我遵循这个程序:
– 创建主要活动的实例(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 随记> 关于cocos2dx接Android sdk的一些坑

关于cocos2dx接Android sdk的一些坑

简单说说UI线程 :在Android中,有个非常重要的家伙非常霸道,那就是UI线程。这霸道之一:不能被阻塞。 之二:系统对每一个组件的调用都从UI线程分发出去。

简单说说openGL线程:但凡cocos2dx 启动的绘制线程都是openGL线程。就这么多


任何SDK界面的调用,必须从UI线程中调用,所以需要放到主线程中。如果我们直接从GL线程中调用,轻则调用不了,重者程序蹦死。

解决办法:

得到主线程的handler,这里简单说一种,就是在onCreate中new一个静态handler。

或者new Handler(Looper.getMainLooper()),且叫mainHandler吧,

启动一个线程,

[java] view plain copy
  1. ThreadsendThread=newThread(newRunnable(){
  2. publicvoidrun(){
  3. mainHandler.post(sendRun);
  4. }
  5. });

[html] copy

android-ndk – 从java(android)调用C(cocos2dx)方法进行我的应用内结算

android-ndk – 从java(android)调用C(cocos2dx)方法进行我的应用内结算

我正在尝试在我的cocos2dx- android项目中添加应用内结算.我可以通过jni从c类调用 java函数.

这是我通过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.cpp文件,看看cocos2dx如何调用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游戏仅显示黑屏

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

Bullet(Cocos2dx)之交叉编译Android,集成到cocos2dx3.x

首先将src文件夹复制到jni文件夹,没有可以新建一个

新建两个文件Android.mkApplication.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


复制头文件

bullet3src的所有文件复制到新建的Bullet文件下


删除不是.h的所有文件

下一步任务繁重,

将所有用到BulletCollisionBulletDynamicsBulletSoftBodyLinearMath目录下的include都加上Bullet/,可以使用Notepad++Bullet目录搜索Bullet,并替换为Bullet/BulletLinearMath并替换为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非静态方法调用的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于 关于cocos2dx接Android sdk的一些坑、android-ndk – 从java(android)调用C(cocos2dx)方法进行我的应用内结算、Android中的cocos2d游戏仅显示黑屏、Bullet(Cocos2dx)之交叉编译Android,集成到cocos2dx3.x的相关信息,请在本站寻找。

本文标签: