JNI针对于cocos2dx

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

这篇博文主要是记录一些做过的,不是一些有太多技术深度的。

主要是使用了Java和c++语言相互函数调用,达到指令或者数据在各个语言间的传输的目的。原来开发cocos2dx游戏所以使用了一些与之相关的,主要体现在c++调用java static函数的时候,使用:JniHelper,JniMethodInfo。

1、Java调用c函数

首先java调用c,主要是通过直接调用在java中声明的一个protected native 函数来调用实际定义在c中的函数:

首先在java中声明此函数,以便于调用: protected native void JavaCall(int arg0);

在c++定义Java中声明的函数(注意:对于在c++中使用c编译成c的函数要使用“extern "C"{}”指明,因为c语言编译完成在内存中使用的是“-JavaCall”,但是在c++由于为了函数的重载,所以编译成的名称是“_JavaCall_int”):

extern "C"
{
JNIEXPORT void JNICALL Java_packageName_AppActivity_JavaCall(JNIEnv*  env, jobject ob, jint value)
{
LuaAndC *er;
er->CallLuaIntegral((int)value);
}

此函数中“Java_packageName_AppActivity_JavaCall”是函数的函数名,其中指明了JavaCall函数所在的包名,类名,和函数名

2、c调用Java

c调用java主要是通过调用java静态方法来实现,而且主要使用了cocos2dx封装的了JniHelper等。

cpp

JniMethodInfo t;
if (!JniHelper::getStaticMethodInfo(t, 
"
packageName/AppActivity",
"
CCall", 
"(ILjava/lang/String;Ljava/lang/String;)V")) 
{
return;
}

同样也是通过包名直接获取到函数,对于getStaticMethodInfo函数主要要注意的是第四个参数,此参数说明了被调用的Java函数的参数列表和返回值,一般的int是“I”,long是“J”,bool是“Z”,char是“C”,string是作为对象对待是“Ljava/lang/String;”,double是“D”,float是“F”,void是“V”。然后就是直接调用函数和释放资源(注意要做数据类型的转化):

jstring _shareStr = t.env->NewStringUTF(shareStr.c_str());//字符串转化

t.env->CallStaticVoidMethod(t.classID,t.methodID,type,_shareStr,_Imgpath);//调用函数

t.env->DeleteLocalRef(_shareStr);
t.env->DeleteLocalRef(t.classID);//删除资源。


java:

static public void CCall(int arg0, String arg1, String arg2){
}

Cocos2d-x与Android互调实践:JNI源码解析 Cocos2d-x 是一个功能强大的跨平台游戏引擎,它用C++语言编写,并且支持多种编程语言接口。Cocos2d-x 以其灵活性、易用性以及开源特性,吸引了众多游戏开发者的目光。它支持诸如 iOS、Android 和 Windows 等主流平台的游戏开发,使得开发者可以使用统一的代码库来构建和发布游戏。这一章节将重点介绍 Cocos2d-x 的基础知识,比如其架构组成、主要特性和支持的平台。 阅读详情

相关推荐

JNI调用Java方法总结

1、首先了解一下native方法的方法签名,方法签名主要是描述了方法的参数和返回值,为了防止方法的重载而导致的调用混乱。

天花板的随笔 7492

cocos2dx jni交互 获取java函数返回的字符串

jni交互 java,c++互传string---未实现获取java的自定义类

dearsir的博客 1919

Cocos2d-x利用jni调用java层代码

jni的意思是java本地调用,通过jni可以实现java层代码和其他语言写得代码进行交互。在cocos2d-x中,如果想要在c++层调用java层的代码,就是通过jni技术。通过调用java层的代码,我们就可以在Android平台下实现一些引擎没有提供给我们的功能,或者做一些其他的功能。比如加个广告,加个分享,调用Android原生的对话框等等吧。Cocos2d-x比较人性化的是为我们封装了jn

Future Of Magic 9801

[cocos2dx]在cocos2dx中通过Jni实现Java与C++的互相调用(二)

jni详解介绍JNI是JVM实现中的一部分,因此Native语言Java代码都运行在JVM的宿主环境。JNI的出现使得开发者既可以利用Java语言跨平台、类库丰 富、开发便捷等特点,又可以利用Native语言的高效。JNI是一个双向的接口:开发者不仅可以通过JNIJava代码中访问Native模块,还可以在 Native代码中嵌入一个JVM,并通过JNI访问运行于其中的Java模块。可见,JN

超越 3574

Cocos2d-x 之使用 Jni

Android 里面有个 jni.h 封装了 java 代码与原生代码交互的功能,cocos2dx 在cocos/platform/android/jni下面有个jniHelper 类是对 jni 的再次封装,使用 jniHelper 能很容易地实现 c++ 代码与 java 互调。C++ 调 Java Android 端没什么特别要做的,只需要把函数定义好就行,函数分静态和实例两种。

xingxinmanong的博客 1609

环境搭建

cocos2dx 1.eclipse 和 xcode集成环境 android:ADT JDK eclipse SDK c++:  CDT  NDK 参考网址: 1.http://www.cnblogs.com/young40/archive/2012/10/19/cocos2d-x-mac-os-x-android-xcode-ios-development-setup.html

renzhe20092584的专栏 1055

[cocos2dx]在cocos2dx中通过Jni实现Java与C++的互相调用(一)

JNI相关知识JNI的意思是java本地接口,通过jni可以实现java层代码和其他语言写得代码进行互调。在cocos2d-x中,如果想要在c++层调用java层的代码,就是通过jni技术。通过调用java层的代码,我们就可以在Android平台下实现一些引擎没有提供给我们的功能,或者做一些其他的功能。比如加个广告,加个分享,调用Android原生的对话框等等吧。Cocos2d-x比较人性化的是为

超越 1171

关于cocos2dx如何通过jni进行c++与java的交互

参考博文:http://codingnow.cn/cocos2d-x/992.html 我们都知道,cocosd2dx的跨平台的游戏引擎,就是一处编写,多平台运行(一般就是用一种语言c++、或lua编写好游戏,然后针对平台去打包,比如打包到我们的安卓手机)。他是如何做到的呢?其实是这样的,本来呢,c++也是平台无关,就是android手机的cpu也是可以识别c++编译出来的指令,然

Mr_xin321的专栏 2861

Cocos2dx下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方案

情况一:JniHelper.h头文件无法找到 方法:需要添加附加包含目录即可解决问题。具体操作步骤如下:右击项目---->c/c++---->常规---->附加包含目录---->添加JniHelper.h所在的路径即可。此时可能还会遇到找不到jni.h和jni_md.h的问题,解决方案为在%JAVA_HOME%/include/下找到 jni.h,在%JAVA_HOME%...

菲菲家的吴先森 2193

构建 Cocos2dx 安卓游戏(二)

到目前为止,我们已经尝试了 Cocos2d-x 框架中捆绑的所有粒子系统,但在我们作为游戏开发者的旅程中,将有很多情况需要我们创建自己的粒子系统。有一些工具允许我们以非常图形化的方式创建和调整粒子系统的属性。这使我们能够创建**所见即所得(WYSIWYG)**类型的粒子系统。创建粒子系统最常用的应用程序,在 Cocos2d-x 官方文档中多次提到,名为 Particle Designer。目前它仅适用于 Mac OS,并且你需要购买许可证才能将粒子系统导出为 plist 文件。

龙哥盟 967

用eclipse运行cocos2dx工程

目的 打cocos的安卓包 环境 1、cocos cocos3.4 2、python(需要安装) pthon2.7 3、jdk (需要安装) jdk-7u79-windows-x64 4、ndk(解压即可) android-ndk-r9b-windows-x86_64 5、apache ant(解压即可) apache-ant-1.9.2 ...

lemon 677

cocos2dx】生成apk时程序出现的问题

问题1:so文件生成后,在eclipse中运行代码出现jni错误 04-09 17:07:31.302: W/dalvikvm(1590): JNI WARNING: 0xb592fea0 is not a valid JNI reference 04-09 17:07:31.302: W/dalvikvm(1590): in Lorg/cocos2dx/lib/Cocos2dxRend...

fanqi987的专栏 648

cocos2dx对于android中sd卡的访问方式

今天在弄项目的时候涉及到cocos2dx引擎需要访问sdcard上的资源,目前发现两种比较简单的方法: 1、直接使用硬编码的方式来进行访问,例如“/storage/sdcard0/NetAnswer/questions%d.xml”的方式来确定文件路径,但是这种方式是正确的,但是为什么还是无效呢,是因为此程序没有权限来对sdcard资源进行访问,这时需要提高应用程序的权限,通过在AndroidM

brucebruce112的专栏 1819

cocos2d-x 中多线程的c/c++代码通过JNI调用java代码

Cocos2dx 的多线程c/c++通过JNI调用java的代码

wu4long的专栏 4481

cocos2dx在Android下如何接入91SDK

版本 cocos2dx: 2.1.391SDK: 3.2.6.1(Android) 适用范围 这里仅仅讨论的是Android的版本 正题 不得不说,91的SDK没有动态库,反而编译起来坑不会那么多,不过既然是Android的整合,坑自然也不会少你的呀,啊哈哈。文档和流程很清楚,可以到91对应的论坛上参考 接入91SDK 加载Lib库 直接的Eclipse中,把91SDK

1万+

cocos2dx 3.0 android.mk,cocos2dx中Android.mk的万能模板

cocos2dx工程打包成Android APK当然少不了编辑android工程目录下的Android.mk文件,主要工作就是把Classes目录下的*.cpp文件添加进来进行编译。下面就分Android工程在Eclipse和AndroidStudio两种情况来说明。Eclipse在项目的 proj.android\jni 目录下的 Android.mk 文件中,需要对 LOCAL_SRC_FIL...

weixin_30693337的博客 345

Cocos2d-x中通过JNI进行C++调用Java代码

转自http://go3k.org/?p=49 主体思路 通过JNI获取java虚拟机,再获取当前程序的JNI环境,通过JNI环境获取需要调用java类信息,再获取需要调用java类中的函数信息。再通过JNI环境调用,使用类信息、函数信息,调用对应的java函数。 看起来好像有点复杂,but不用担心,cocos2d-x中有一个JniHelper类(头文件的copyright为:c

Orca的移动开发轨迹 1万+

Cocos2dx源码赏析(1)之启动流程与主循环

    我们知道Cocos2dx是一款开源的跨平台游戏引擎,而学习开源项目一个较实用的办法就是读源码。所谓,“源码之前,了无秘密”。而笔者从事的也是游戏开发工作,因此,通过梳理下源码的脉络,来加深对Cocos2dx游戏引擎的理解。 既然,Cocos2dx是跨平台的,那么,就有针对不同平台运行的入口以及维持引擎运转的“死循环”。下面,就分别从Windows、Android、iOS三个平台说明下...

gulan0的博客 784

怎样在cocos2Dx项目里加so库

转载于:http://blog.sina.com.cn/s/blog_520328990101kau5.html 正题 一般支付SDK的接入,都有客户端和服务端,服务端不在本篇文章的讨论范围内,仅仅讲客户端,并且,这里只讲Android方面的,iOS的我也不怎么懂。反正所有的模式都是至少提供一个jar包,给Java作为调用入口,然后如果有涉及较为底层的操作,都会由一个.so动态库文

afei198409的专栏 1546
LPnewqq
博客等级 码龄14年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值