cocos2dx JAVA,C++互相调用函数
C++调用JAVA 例子
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
int KuNiuLogin(lua_State *lua)
{
JniMethodInfo methodInfo;
auto isOk = JniHelper::getStaticMethodInfo(methodInfo, "org/cocos2dx/cpp/AppActivity", "sdkLogin", "()V");
if (isOk)
{
auto activityObj = methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID);
}
;
}
#endif
前提假设:
有这么一个java文件.
org/cocos2dx/cpp/AppActivity.java
这个类有一个sdkLogin的静态共有函数.
class AppActivity {
public static void sdkLogin() {}
};
我们需要通过C++调用上面的JAVA函数 sdkLogin.
JniHelper.h 是cocos2dx引擎自带操作java的头文件, 它在Windows平台不起作用.
如果你需要vs的语法提示, 你可以把它写在条件编译外面,
这么做会报错, 因为里面包含了jni.h文件, 这个文件在java虚拟机安装目录可以找到,
放到vs include目录即可.
JniHelper::getStaticMethodInfo(methodInfo, "org/cocos2dx/cpp/AppActivity", "sdkLogin", "()V");
第一个参数是一个JniMethodInfo类型的参数.
第二个参数指定java文件的路径,
第三个参数是函数名,
第四个参数是参数签名. (google有更详细的签名解释).
返回true表示获取函数成功.
于是
auto activityObj = methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID);
这行就是调用了...
JAVA调用C++例子.
extern "C" {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
void Java_org_cocos2dx_cpp_JniTestHelper_KuNiuLogin(JNIEnv *env, jobject thiz, jstring jstr)
{
auto strOpenId = env->GetStringUTFChars(jstr, NULL);
env->ReleaseStringUTFChars(jstr, strOpenId);
}
#endif
}
注意这个函数的命名.
Java 前缀.
org_cocos2dx_cpp 包名.
JniTestHelper 类名.
KuNiuLogin 函数名.
参数:
前两个参数是必须的, 具体用处google有..
后面的参数填自己需要的, 注意类型.
在函数内部获取参数的时候, 要通过以上方法获取.
JAVA只要建一个类, 命名为 JniTestHelper,
定义函数 KuNiuLogin, 这个函数必须按照NDK的约定定义.
public static native void KuNiuLogin(String openId);
native 前缀必须要加, 这个函数在JAVA中无需实现, 自动映射C++函数.
使用的时候直接 JniTestHelper.KuNiuLogin(""); 就可以了.
cocos2dx JAVA,C++互相调用函数的更多相关文章
- Cocos2d-x java 通过jni调用c++的方法
前面博客说到,cocos2d-x c++界面层运行在一个GLThread线程里面,严格的说是运行在Cocos2dxGLSurfaceView(继承自GLSurfaceView) 里面.opengl的渲 ...
- Java -- JDBC 学习--调用函数&存储过程
调用函数&存储过程 /** * 如何使用 JDBC 调用存储在数据库中的函数或存储过程 */ @Test public void testCallableStatment() { Connec ...
- Null作为参数的时候,Java编译器如何调用函数?
public class TestNull { public void method(Object o){ System.out.println("Object Version") ...
- 二、Cocos2dx中Android部分的c++和java实现相互调用(高级篇)
本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=97 本文目的 要完成在cocos2dx的场景上一个点击事件,传递一个消息到java层,下面让我们看看 ...
- java下实现调用oracle的存储过程和函数
在Oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR() PRIMARY KE ...
- Java调用函数传递参数到底是值传递还是引用传递
今天翻看微信上有关Java技术的公众号时,看到了一篇关于Java中值传递的问题,文章讨论了在Java中调用函数进行传参的时候到底是值传递还是引用传递这个面试时会问到的问题.之前也接触过类似的问题,但只 ...
- 通过Java发射机制调用可变参数函数
1.获取可变参数的函数 获取可变参数的函数与获取参数类型为数组类型一样. clazz.getMethod("test", Object[].class); 其中O ...
- 【学习】java下实现调用oracle的存储过程和函数
在oracle下创建一个test的账户,然后按一下步骤执行: 1.创建表:STOCK_PRICES --创建表格CREATETABLE STOCK_PRICES( RIC VARCHAR(6) PRI ...
- 第39篇-Java通过JNI调用C/C++函数
在某些情况下,Java语言需要通过调用C/C++函数来实现某些功能,因为Java有时候对这些功能显的无能为力,如想使用X86_64 的 SIMD 指令提升一下业务方法中关键代码的性能,又或者想要获取某 ...
- java 代码调用函数
sql 中调用函数 getDistance(lng1 float, lat1 float, lng2 float, lat2 float) 例如: SELECT id, f_seller_id sel ...
随机推荐
- 嵌入式系统烧写uboot/bootloader/kernel的一般方法
嵌入式系统烧写uboot/bootloader/kernel的一般方法 本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误, ...
- C#操作Active Directory(AD)详解
1. LDAP简介 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门 ...
- html/php, 二个文本框求和,在第三个框中显示
我想要实现的是第三个文本框本来输出的是默认值,按了提交按钮之后,显示了一个我通过php某个计算后想要输出的值,如何实现?就好比说:我输入两个数,我按了个提交按钮之后,那个第三个文本框本来输出是“输出框 ...
- qut训练题解-2016-9-4个人赛
题目链接:http://acm.hust.edu.cn/vjudge/contest/131124#overview 贴了链接这里就不上原题的描述了. A: B: 分析:这里用到简单的拓扑排序的算法. ...
- codeforces 385C Bear and Prime Numbers 预处理DP
题目链接:http://codeforces.com/problemset/problem/385/C 题目大意:给定n个数与m个询问区间,问每个询问区间中的所有素数在这n个数中被能整除的次数之和 解 ...
- hdu 4472 Count(递推即dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4472 代码: #include <cstdio> #include <cstring ...
- 406. Queue Reconstruction by Height
一开始backtrack,设计了很多剪枝情况,还是TLE了 ..后来用PQ做的. 其实上面DFS做到一半的时候意识到应该用PQ做,但是不确定会不会TLE,就继续了,然后果然TLE了.. PQ的做法和剪 ...
- 最大流加强 dinic+当前弧优化
qyy开始练习网络流啦 , 啊 ,蒟蒻只会套版 ,很裸的题 , 我连题都不想发了 ,可以参考我的代码(虽然我也是看的别人的 #include <iostream> #include < ...
- 快速幂模m算法
给你三个数,a,b,m 求a^b%m的值. 如果b过大,用普通的快速幂会超时. 所以将b=2^0*b0+2^1*b+b1...... 然后,你们利用初中的知识就知道怎么做了. 继续,上代码. #inc ...
- string字符串转成16进制
package util; public class EscapeUnescape { public static String escape(String src) { int i; char j; ...