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、
#include "../platform/android/jni/JniHelper.h"
2、
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo,
if (!isHave)
{
else
{
#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"。
第四个参数:(参数)返回值。括号内为传入的参数类型,括号后面为返回值类型。
本例中的(参数)返回值为:"(I)V"。
之后经过NDK编译,Eclipse导入运行,在日志中会得到如下结果:
通过修改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左侧的导航栏不见了怎么调: 最笨:关闭重新打开