查看: 2298|回复: 1
打印 上一主题 下一主题

[其他] JniHepleer——实现C++调用Java代码

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-8-30 01:41:00 |只看该作者 |倒序浏览
①加入头文件
将Jdk中的"include/jni.h"和“include/win32/jni_md.h”拷贝到VS201X安装目录的"VC/include"下
②包含头文件
#include "../android/jni/JniHelper.h"
#include "jni.h"
③C++中代码(主要的)
//jni调用测试
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo info;
//bool isHave = JniHelper::getStaticMethodInfo(info, "com/lch/myGame", "function", "()V");      //()中为参数类型,V为返回值类型
//bool isHave = JniHelper::getStaticMethodInfo(info, "com/lch/myGame", "function1", "(Ljava/lang/String;)V");
//bool isHave = JniHelper::getStaticMethodInfo(info, "com/lch/myGame", "function2", "()Ljava/lang/String;");
//bool isHave = JniHelper::getStaticMethodInfo(info, "com/lch/myGame", "function3", "(II)I");
bool isHave = JniHelper::getStaticMethodInfo(info, "com/lch/myGame", "getObject", "()Ljava/lang/Object;");
jobject jobj;
if (isHave)
{
  CCLog("C++ : The function is exist");
  //无参数无返回值
  //info.env->CallStaticVoidMethod(info.classID, info.methodID);
  //有参数无返回值
  /*jstring str = info.env->NewStringUTF("msg");
  info.env->CallStaticVoidMethod(info.classID, info.methodID, str);*/
  //无参数有返回值
  /*jstring jstr = (jstring)info.env->CallStaticObjectMethod(info.classID, info.methodID);
  std::string str = JniHelper::jstring2string(jstr);
  CCLog("C++ : %s", str.c_str());*/
  //有参数有返回值
  /*jint x = 10;
  jint y = 20;
  jint jRes = info.env->CallStaticIntMethod(info.classID, info.methodID, x, y);
  CCLog("C++ : result: %d", jRes);*/
  //调用动态方法步骤一
  jobj = info.env->CallStaticObjectMethod(info.classID, info.methodID);
}
else
{
  CCLog("C++ : The function is not exist");
}
isHave = JniHelper::getMethodInfo(info, "com/lch/myGame", "function4", "()V");
if (isHave)
{
  CCLog("C++ : The function is exist");
  //调用动态方法步骤二
  info.env->CallVoidMethod(jobj, info.methodID);
}
else
{
  CCLog("C++ : The function is not exist");
}
#endif

④Java中代码(主要的)
public static myGame instance;
public static Handler handler;
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  instance = this;
  handler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
    switch (msg.what) {
    case 1:
     // 退出游戏
     Builder builder = new Builder(FlyGame.this);
     builder.setTitle("亲!确定要退出游戏吗?")
       .setPositiveButton("确定", new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog,
          int which) {
         System.exit(0);
        }
       }).setNegativeButton("取消", null).show();
    default:
     break;
    }
   }
  };
}
    public static void function(){
     System.out.println("Java: " +"无参无返回值");
    }
   
    public static void function1(String str){
     System.out.println("Java: " +"有参无返回值 " + str);
    }
   
    public static String function2(){
     System.out.println("Java: " +"无参有返回值 ");
     
     return "Java return msg";
    }
   
    public static int function3(int x, int y){
     System.out.println("Java: " +"有参有返回值 ");
     
     return x + y;
    }
   
    public static Object getObject(){
     System.out.println("Java: " +"返回一个实例 ");
     
     return instance;
    }
   
    public void function4(){
     System.out.println("Java: " +"非静态函数 ");
     buyProp();
    }
   
    public static void exitGame(){
     Message msg  = Message.obtain();
     msg.what = 1;
     handler.sendMessage(msg);
     System.out.println("Java: " +"退出游戏确认 ");
    }

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-8-30 17:50:50 |只看该作者
Good to know !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-27 00:13 , Processed in 0.088651 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部