-
1、创建Cocos2d-x工程
(1)cd /Users/自己用户名/Desktop/cocos2d-x-3.1/tools/cocos2d-console/bin (2)cocos new JniDemo -p com.pactera.jni -l cpp -d 自己的工程路径2、将新建工程的proj.android导入ADT
(1)FILE->Import->Android->Existing Android Code Into Workspace (2)next->Browse,找到刚才创建工程目录中的proj.android,Finish即导入完成3、将新建工程导入XCode
(1)点击proj.ios_mac中的XXXX.xcodeproj即完成导入。 (2)在HelloWorld.cpp头文件下添加如下代码:
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include <jni.h> #include "../../cocos2d/cocos/platform/android/jni/JniHelper.h"//这里的路径要根据你工程的实际情况进行更改 #include #if1 #define LOG_TAG "JniHelper" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) #else #define LOGD(...) #endif #endif</android></jni.h>
(3)在下面函数中添加如下代码:
-
void HelloWorld::menuCloseCallback(Ref* pSender) { #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) JniMethodInfo info; //getStaticMethodInfo判断java定义的静态函数是否存在,返回bool bool ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func1","()V"); if(ret) { log("call void func1() succeed"); //传入类ID和方法ID,小心方法名写错,第一个字母是大写 info.env->CallStaticVoidMethod(info.classID,info.methodID); } ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func2","()I"); if(ret) { log("call int func2() succeed"); jint iret = info.env->CallStaticIntMethod(info.classID,info.methodID); log("func2 return = %d",iret); } ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func3","(I)Ljava/lang/String;"); if(ret) { log("Call int func3(int) succeed"); jobject jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID,1438); } ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func4","(Ljava/lang/String;)Ljava/lang/String;"); if(ret) { log("call string func4(string) succeed"); jobject para = info.env->NewStringUTF("haha"); jstring jstr = (jstring)info.env->CallStaticObjectMethod(info.classID,info.methodID,para); std::string text = JniHelper::jstring2string(jstr); log("%s",text.c_str()); } ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/cpp/TestJni","func5","(II)I"); if(ret) { log("call int func5(int a, int b) succeed"); jint iret = info.env->CallStaticIntMethod(info.classID,info.methodID,1,2); log("return value is %d",iret); } #endif }
4、ADT中创建java新类
(1)单击ADT中工程名称,展开工程目录,找到src,单击展开src目录,看到该目录下有一个AppActivity.java的类,为了演示我们的功能,右击New->Class,填入类名,如:TestJni,此时在src目录中增加了一个TestJni.java的类。注意此时应该会报错。看下一步。 (2)第(1)步中出现的错误一般是因为没有导入引擎下的src。具体操作是:右击工程名->Properties-> Java Build Path->Source->Link Source->Browse。此时导入引擎目录下如:cocos2d-x-3.1/cocos/platform/android/java/src,然后在Folder name中随便写一个名字即可。点击Finish,OK。此时会在工程目录中添加刚才导入目录的引用。第(1)步的错误也就消失了。 (3)在(1)步创建的类中添加如下代码:
package org.cocos2dx.cpp; import android.R.integer; import android.util.Log; public class TestJni { publicstaticvoid func1() { Log.e("hello","world"); } publicstaticint func2() { return12345; } publicstaticString func3(inti) { String str ="get int value:"+ i; Log.e("yu", str); returnstr; } publicstaticString func4(String str) { Log.e("func4","str"); returnstr; } publicstaticint func5(inta,intb) { intc = a + b; Log.e("func5","a+b"); returnc; } }
5、编译吧
是不是又出现问题了,如果是第一次编译,可能是没有配置NDK_ROOT环境,解决办法见博客 http://blog.youkuaiyun.com/yuxikuo_1/article/details/39536287 简单的说就是,使ADT处于屏幕最前端,单击左上角的ADT->Preferences->C/C++->Build->Environment,依次敲上你NDK的位置和NDK_ROOT即可。6、至此,在Cocos2d-x工程中通过Jni调用java中的静态函数应该没问题了。下面是程序的截图。
-
转自:http://www.2cto.com/kf/201409/338207.html