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++互相调用函数的更多相关文章

  1. Cocos2d-x java 通过jni调用c++的方法

    前面博客说到,cocos2d-x c++界面层运行在一个GLThread线程里面,严格的说是运行在Cocos2dxGLSurfaceView(继承自GLSurfaceView) 里面.opengl的渲 ...

  2. Java -- JDBC 学习--调用函数&存储过程

    调用函数&存储过程 /** * 如何使用 JDBC 调用存储在数据库中的函数或存储过程 */ @Test public void testCallableStatment() { Connec ...

  3. Null作为参数的时候,Java编译器如何调用函数?

    public class TestNull { public void method(Object o){ System.out.println("Object Version") ...

  4. 二、Cocos2dx中Android部分的c++和java实现相互调用(高级篇)

    本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=97 本文目的 要完成在cocos2dx的场景上一个点击事件,传递一个消息到java层,下面让我们看看 ...

  5. java下实现调用oracle的存储过程和函数

    在Oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR() PRIMARY KE ...

  6. Java调用函数传递参数到底是值传递还是引用传递

    今天翻看微信上有关Java技术的公众号时,看到了一篇关于Java中值传递的问题,文章讨论了在Java中调用函数进行传参的时候到底是值传递还是引用传递这个面试时会问到的问题.之前也接触过类似的问题,但只 ...

  7. 通过Java发射机制调用可变参数函数

    1.获取可变参数的函数       获取可变参数的函数与获取参数类型为数组类型一样. clazz.getMethod("test", Object[].class);    其中O ...

  8. 【学习】java下实现调用oracle的存储过程和函数

    在oracle下创建一个test的账户,然后按一下步骤执行: 1.创建表:STOCK_PRICES --创建表格CREATETABLE STOCK_PRICES( RIC VARCHAR(6) PRI ...

  9. 第39篇-Java通过JNI调用C/C++函数

    在某些情况下,Java语言需要通过调用C/C++函数来实现某些功能,因为Java有时候对这些功能显的无能为力,如想使用X86_64 的 SIMD 指令提升一下业务方法中关键代码的性能,又或者想要获取某 ...

  10. java 代码调用函数

    sql 中调用函数 getDistance(lng1 float, lat1 float, lng2 float, lat2 float) 例如: SELECT id, f_seller_id sel ...

随机推荐

  1. 大型系统OA--技术

    OA办公自动化系统--技术 1.由于涉及企业的流程控制与规则管理.所以系统对于规范要求的严谨性,导致在小型开发组在进行开发时必须基于成熟的技术架构.开源的lemon OA,采用了如下技术细节: mys ...

  2. HDOJ/HDU 1865 1sting(斐波拉契+大数~)

    Problem Description You will be given a string which only contains '1'; You can merge two adjacent ' ...

  3. HDOJ1002题A + B Problem II,2个大数相加

    Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...

  4. 在MacOSX下使用Github管理Xcode代码

    版本控制应该算是每个程序员所必备的技能,这个重要性,我就不多说了哈.现在版本控制基本上就是两种途径:SVN和Git.对于SVN我并不是非常了解,只知道在Windows下非常实用,但是在MacOSX下, ...

  5. 415. Add Strings

    没什么限定的话,先翻转,在一位一位加,记得进位就行了.. public class Solution { public String addStrings(String num1, String nu ...

  6. UBUNTU 札记(53条经验)

    adobe_pdf 菜单栏 /etc/profile 是一个global config file,会影响系统全局用户,如果你只想对single user生效的话,可以修改vi ~/.bash_prof ...

  7. flash引入

    博客页面引入一个小人的动画时钟代码 <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase ...

  8. mapreduce 读写lzo文件

    1.读lzo文件 需要添加以下代码,并导入lzo相关的jar包  job.setInputFormatClass(LzoTextInputFormat.class); 2.写lzo文件 lzo格式默认 ...

  9. 未能从程序集“WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35“ 中加载“System.Windows.SplashSceen”

    通过添加windowsbase.dll,可以解决这个问题,你可以在自己的电脑上找到这个文件,地址是:C:\Program Files\Reference Assemblies\Microsoft\Fr ...

  10. hibernate之自定义持久化实现