关闭

Cocos2D-X中在C++中调用JAVA的方法

879人阅读 评论(0) 收藏 举报
分类:

Cocos2D-X中在C++中调用JAVA的方法

cocos2d-x android java调用C++     -------------http://www.cnblogs.com/sevenyuan/p/3684333.html

        cocos2d-x中有一个JniHelper类详细使用

 

------------------------------------2015年------------------C++ 调用Java

必须的有关键字  native。

注释:1.Java_com_newtest2_jniHelper_SendInfo  ”Java”开头   ”com_nretest2”为包名  ”jniHelper”为对应的java文件  ”SendInfo”为对应的方法  使用”_”连接2.(JNIEnv *env, jobject thiz, jstring info) 只有jstring info为自己的参数  其余两个为自带参数

--------------------------------------------------

CPP文件中(以HelloWorld为例):

1、 首先导入h文件:

#include "../platform/android/jni/JniHelper.h"

2、 在需要调用JAVA方法的地方,加入如下代码:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //断当前是否为Android平台

JniMethodInfo minfo; //定义Jni函数信息结构//getStaticMethodInfo次函数返回一个bool值表示是否找到此函数

bool isHave = JniHelper::getStaticMethodInfo(minfo,

"com/meetfuture/jnitest/JNI_Test","testFunWithInt","(I)V");

if (!isHave)

{

CCLog("jni:此函数不存在");

}

else

{

CCLog("jni:此函数存在");

  //调用此函数

  minfo.env->CallStaticVoidMethod(minfo.classID,minfo.methodID, 823);

}

CCLog("jni-java函数执行完毕");

#endif

代码说明:

1、#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)

判断设备是否为Android设备,如果是,则执行代码到#endif为止,如果不是,则跳过此段代码;

2、JniHelper::getStaticMethodInfo (JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);

获取JAVA方法的信息,共有四个参数:

第一个参数:JniMethodInfo 类型,用于JNI的操作;

第二个参数:类的路径。本例类的路径为:"com/mycompany/jnitest/JNI_Test"

第三个参数:方法名。注意方法名一定要定义为static。对应上图的方法名为:"testFunWithInt"

Cocos2D-X中在C++中调用JAVA的方法


第四个参数:(参数)返回值。括号内为传入的参数类型,括号后面为返回值类型。

本例中的(参数)返回值为:"(I)V"

之后经过NDK编译,Eclipse导入运行,在日志中会得到如下结果:

Cocos2D-X中在C++中调用JAVA的方法

通过修改JAVA代码,可以得到不同的结果。

游戏美工分类:
游戏UI设计师
原画设计师
特效设计师
动画设计师


---------------java调用C++
 Java中:
 public static native void nativeLogin(String name,String pass) ;

C++中:

.H中
#ifndef WIN32
extern "C"
{
 void  Java_com_u58_cocosgame_DDZ2_nativeLogin(JNIEnv* env, jobject thiz, jstring name, jstring pass);
};
#endif //WIN32

.cpp 中
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 
 extern "C"
 {
  //  1.Java_com_newtest2_jniHelper_SendInfo  ”Java”开头   ”com_nretest2”为包名  ”jniHelper”为对应的java文件  ”SendInfo”为对应的方法  使用”_”连接
  //  2.(JNIEnv *env, jobject thiz, jstring info) 前2个为自带参数, 其余jstring info为自己的参数 
  void  Java_com_u58_cocosgame_DDZ2_nativeLogin(JNIEnv* env, jobject thiz, jstring name, jstring pass)
  {
   MessageBox(A2U8("java ->"), A2U8("c++"));
  }
 }

 

验证: 真机上运行, 点击按钮时 出来弹出框 就对的

---------------C++调用 java
Java:
 // test_java
 public  void  test_java(String  _str)
 {
  System.out.println("this is a test !"   );
 }

C++:
// C++ 调用Java
void  LoginScene::test_Java()
{

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)    //断设备是否为Android设备,如
 __android_log_print(ANDROID_LOG_ERROR, "LoginScene", "LoginScene::test_Java()");  // 可以删除

 JniMethodInfo minfo;
 jobject jobj;

 //if (GETGAMEJAVAINSTANCE)  //JniHelper::getStaticMethodInfo(minfo, "com/u58/cocosgame/DDZ2","getInstance3","()Lcom/u58/cocosgame/DDZ2;")
 if(GETGAMEJAVAINSTANCE)  // 获取 X包中DDZ2obj;
 {
  //调用Java静态函数,取得对象。 
  __android_log_print(ANDROID_LOG_ERROR, "LoginScene", "LoginScene::test_Java() 1");

  jobj = minfo.env->CallObjectMethod(minfo.classID, minfo.methodID);
  if (jobj != NULL)
  {
   __android_log_print(ANDROID_LOG_ERROR, "LoginScene", "LoginScene::test_Java() 2");
   jstring jname = minfo.env->NewStringUTF("this is name");
   jstring jpass = minfo.env->NewStringUTF("this is password");   //分配空间
 
   if (JniHelper::getMethodInfo(minfo, GAMEPACKAGE, "test_Java", "(Ljava/lang/String;Ljava/lang/String;)V")) // ()V  参数+返回值
   {
    __android_log_print(ANDROID_LOG_ERROR, "LoginScene", "LoginScene::test_Java() 3");
    //调用java非静态函数, 参数1:Java对象,上面已经取得   参数2:方法ID 
    //minfo.env->CallVoidMethod(jobj, minfo.methodID,jms); 
    minfo.env->CallVoidMethod(jobj, minfo.methodID, jname,jpass);     //???  voidMethod2
    log("test_Java succeed");
    minfo.env->DeleteLocalRef(jname);
    minfo.env->DeleteLocalRef(jpass);  // 释放空间
    return;
   }

}

 

----------------------------------------------2016年------------------C++ Java在eclipse工程代码


public class DDZ2 extends PhoneGameActivity {
static DDZ2 sDDZ2 = null;

private static final String TAG = "DDZ2";
private static final int RQF_PAY = 1;
private static final int RQF_LOGIN = 2;

//---------//注释:关键字 native
public static native void nativeLogin(String name,String pass) ;

// test_java    static
public    void  test_Java(String  name, String pass)
{
  Log.e("DDZ2", "test_java:" + name + pass);

  //调用C++
  nativeLogin(name, pass);
}

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  sDDZ2 = this;
  SetGameContext(this);
  mstrInstallPath = getPackageResourcePath();
  m_webLayout = new FrameLayout(this);
  addContentView(m_webLayout, new LayoutParams(LayoutParams.FILL_PARENT,
    LayoutParams.FILL_PARENT));
}

public Cocos2dxGLSurfaceView onCreateView() {

-------------------代码  ---  看懂与会是2嘛事

#define   GAME_PACKAGE   "org/cocos2dx/phonegame/PhoneGameActivity"
void   GameLogin::C_Call_Java(std::string _str)
{
#if( CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
MessageBox( "begin",nullptr);
JniMethodInfo  minfo;
jobject  jobj;
// "org/cocos2dx/phonegame/PhoneGameActivity","getInstance3","()Lorg/cocos2dx/phonegame/PhoneGameActivity;")

// 这句话:查找函数存不存在   存在得到类的obj
bool isHave = JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/phonegame/PhoneGameActivity", "getInstance3", "()Lorg/cocos2dx/phonegame/PhoneGameActivity;");
if(JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/phonegame/PhoneGameActivity","getInstance3","()Lorg/cocos2dx/phonegame/PhoneGameActivity;"))
  // 一直报错误:A最后面;分号  B GAME_PACKAGE应该是/(反斜杠)我用.  CGAME_PACKAGE:中类名字没写,只写到包名字   D()Object返回值:写到包的名字没写类型 
{
  MessageBox( "begin2",nullptr);
  jobj = minfo.env->CallObjectMethod(minfo.classID, minfo.methodID);
  if (jobj)
  { MessageBox( "begin3",nullptr);
   if (JniHelper::getMethodInfo(minfo, GAME_PACKAGE, "openWebView", "(Ljava/lang/String;)V"))
   { 
    jstring jname = minfo.env->NewStringUTF("http://www.baidu.com");
    minfo.env->CallVoidMethod(jobj, minfo.methodID, jname);
    minfo.env->DeleteLocalRef(jname);
   }
  }
}

#endif
}


#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
extern "C"
{
void  Java_org_cocos2dx_phonegame_nativeTest(JNIEnv* env, jobject thiz, jstring name)    // 一直报错误,  首字母J大写
{
  const char *temp = env->GetStringUTFChars(name, NULL);

  MessageBox("I am  ZhangSanFeng!", nullptr);
  env->ReleaseStringUTFChars(name, temp);

}

}
#endif

 

----

能不问就不问, 知道在他心里我就是一个啥都不会的。。。傻逼  

1。    文件组织: 包-->源文件文件 --->类
2      打开WeiQinQi的Android工程, 用啥工具 / 在哪里打开
3     if (JniHelper::getMethodInfo(minfo, PHONEGAMEPACKAGE, "PhoneCall", "(Ljava/lang/String;)V"))
PHONEGAMEPACKAGE :能看出来啥????

4  底层都是用Java实现的:
//录制声音  ////声音识别线程 //获取当前的网络状态  // 打电话

5  自己写C++ 调用java
A 包中文件和类 B 通过static方法能拿到类对象。  C 编写java函数

------------------------------------------------
1 java程序的起点
java虚拟机实例通过调用某个类的main()来运行一个Java程序,而这个main()必须是public
static void 并接收一个字符串数组作为参数,任何拥有这样一个main()的类都可以作为java程
序的起点。

2  库文件
在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。

3  Java采用包结构来组织和管理类和接口文件
 本文介绍Java语言类库中几个常用的包,因为这几个包在软件开发与应用中经常需要用到,其中有些包是必要的。若是离开它,还真不能做事情了

4     JniMethodInfo minfo;  定义Jni函数信息结构体
     getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
  真正调用的是:Callphone,  为什么要多一个 上面的过程。 --- 拿到类obj, 之后才可调用method

5   调试程序
一种方法是用Logcat程序,在Eclipse中windows->show view->other->android->logcat可打开。 详见:如何使用android中的logcat调试程序
6
eclipse左侧的导航栏不见了怎么调:  最笨:关闭重新打开

 

0
2

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:167562次
    • 积分:3604
    • 等级:
    • 排名:第9117名
    • 原创:182篇
    • 转载:113篇
    • 译文:1篇
    • 评论:4条
    最新评论