cocos2dx 通过jni调用安卓底层方法
cocos2dx通过封装JniHelper类来调用安卓api底层函数,该文件在cocos/platform/android/jni/JniHelper.h,使用方法如下:
打开eclipse,导入cocos2dx的项目为安卓项目,如下所示:
新建一个java文件在org.cocos2dx.lib包下,起名为
Cocos2dxTestJni.java,里面添加一个单例的静态方法和一个成员函数(判断是否开启wifi),如下所示:
package org.cocos2dx.lib;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class Cocos2dxTestJni {
private static Cocos2dxTestJni instance = null;
public static Object getInstance()
{
if(instance == null)
instance = new Cocos2dxTestJni();
return instance;
}
public boolean bOpenWifi()
{
Context context = Cocos2dxActivity.getContext();
ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if(activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI)
{
System.out.println("wifi is open");
return true;
}
System.out.println("wifi is close");
return false;
}
}
在c++层调用安卓底层函数,首先包含头文件:
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#endif
调用方法如下:
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
JniMethodInfo info;
bool ret = JniHelper::getStaticMethodInfo(info,"org/cocos2dx/lib/Cocos2dxTestJni","getInstance","()Ljava/lang/Object;");
jobject jobj;
if(ret)
{
log("success to call getInstance Func");
jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID);
bool ret2 = JniHelper::getMethodInfo(info,"org/cocos2dx/lib/Cocos2dxTestJni","bOpenWifi","()Z");
if(ret2)
{
jboolean jb = info.env->CallBooleanMethod(jobj,info.methodID);
if(jb == JNI_TRUE)
log("success Call bOpenWifi");
else
log("no wifi open");
}
}
else
{
log("failed to call getInstance Func");
}
#endif
JniHelper::getStaticMethodInfo方法是根据脚本文件路径、函数名字、签名缩写来获取方法的具体信息,包括类id,方法id,运行环境等,保存在JniMethodInfo的变量中,
info.env->CallStaticObjectMethod(info.classID,info.methodID);通过类id,方法id调用函数,然后放回一个jobject类型。
具体其他函数可以查看unity圣典的api文档:http://game.ceeger.com/Script/AndroidJNI/AndroidJNI.html
jni的签名缩写的缩写如下表所示:
jni的返回类型如下:
将cocos项目打包成apk包,打开eclipse调试,查看输出
笔者很懒,暂时先写到这里
cocos2dx 通过jni调用安卓底层方法的更多相关文章
- Cocos2d-x java 通过jni调用c++的方法
前面博客说到,cocos2d-x c++界面层运行在一个GLThread线程里面,严格的说是运行在Cocos2dxGLSurfaceView(继承自GLSurfaceView) 里面.opengl的渲 ...
- 从本地方法栈看到jni调用
我们都知道java虚拟机所管理的内存区域包括方法区,堆,虚拟机栈,本地方法栈,程序计数器. 在<深入理解java虚拟机>中,周志明老师对虚拟机栈进行了讲解,但是对本地方法栈却一笔带过.今天 ...
- JNI系列——C文件中的方法调用Java中方法
1.创建xxx.jni包并在该包下实现一些Java的方法,和要调用的本地方法 2.实现MainActivity中的按钮点击事件-即点击按钮调用本地的方法 3.在C文件中的方法中回调Java的方法 3. ...
- HAL中通过JNI调用java方法【转】
转载请注明本文出处:http://www.cnblogs.com/xl19862005 作者:Xandy 由于工作的需要,最近一直在研究HAL.JNI.Java方法之间互调的问题,并做了如下一些记录和 ...
- RN 调用安卓的原生方法(实现Toast效果)
首先明确一点,坑实在是是太多了-神奇呀! ok! 基本思路: 1.用AS打开一个已经存在的项目(这里可以打开项目中的android也可以是android里面的build.gradle) 2.在AS里新 ...
- Android Studio NDK开发-JNI调用Java方法
相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...
- Unity调用安卓中的方法遇到的问题
最近在用U3D做一个简单的迷宫游戏,在项目中利用Unity制作游戏场景,在android中调用游戏场景,并在游戏结束后调用安卓方法,传递参数,退出游戏场景 查找网上资料,基本上Unity调用安卓的写法 ...
- UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr!
UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr! 原因是····· 得运行在一个真正的Android设备上! 得运行在一个真正的And ...
- java native interface JNI 调用Java方法
在上一篇文章中介绍了JNI.以及java调用JNI.这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你能够创建Java对象,get.set 静态(static)和 实例(instanc ...
随机推荐
- 洛谷P2285 [HNOI2004]打鼹鼠
P2285 [HNOI2004]打鼹鼠 题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某 ...
- Elasticsearch内存分配设置详解(转)
Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了.如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题.这里有两种方式修改Elastics ...
- shell编程 条件判断式----利用 case ..... esac 判断
条件判断式----利用 case ..... esac 判断 case $变量名称 in <==关键词为 case ,还有变量前有钱字号 "第一个变量内容") &l ...
- Vue中登录模块
- 51nod 1515 明辨是非 并查集+set维护相等与不等关系
考试时先拿vector瞎搞不等信息,又没离散化,结果好像MLE:后来想起课上讲过用set维护,就开始瞎搞迭代器...QWQ我太菜了.. 用并查集维护相等信息,用set记录不相等的信息: 如果要求变量不 ...
- docker postgresql FATAL: could not access private key file "/etc/ssl/private/ssl-cert-snakeoil.key": Permission denied
在docker中启动postgresql时出现错误 FATAL: could not access private key file "/etc/ssl/private/ssl-cert- ...
- 洛谷 P1969 积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- 2017年2月28日-----------乱码新手自学.net 之特性与验证
现在看asp.net MVC5自学已经到了第六章:数据注解与验证. 话得从以前看MVC music store(音乐商店项目)的源码说起, 最初看music store源码完全就是一脸懵逼,整个程序, ...
- 定时器 & 日期时间对象 & 正则
1 JavaScript 计时事件 通过使用 JavaScript,有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行,这称之为计时事件. 两个关键方法是: setInterv ...
- jetty启动(server-connector-handle-start-join)
import java.io.File; import java.io.IOException; import java.util.Map; import javax.servlet.ServletE ...