java和c++互调原则

通过这2天的研究,总结出java和c++互调原则
================================================================
1.c++调用java 首先是在vs上创建出java环境,导入java包,
得到具体类名和方法,比较简单
=================================================================
2.java调用c++ 相对比较复杂
{
一、从Java调用C++的DLL


  1.    创建Java文件


  创建名为TestNative的Java文件,注意包名。


  package org.druze.test;


  publicclass TestNative {


  publicnativevoid sayHello();


  publicvoid sayHello2(){


  System.out.println("Say Hello From Java");


  }


  }


  如代码所示,对于sayHello方法声明为native,这一部分将由C++的动态库来实现。


  2.    生成class文件


  使用javac org/druze/test/TestNative.java生成class文件


  注意:执行该命令在org所在目录执行。


  3.    使用javah命令生成相应的C++头文件


  使用javah org.druze.test.TestNative生成名为


  org_druze_test_TestNative.h的头文件


  注意:执行该命令在org所在目录执行。


  该头文件的内容如下:


  /* DO NOT EDIT THIS FILE - it is machine generated */


  #include <jni.h>


  /* Header for class org_druze_test_TestNative */


  #ifndef _Included_org_druze_test_TestNative


  #define _Included_org_druze_test_TestNative


  #ifdef __cplusplus


  extern "C" {


  #endif


  /*


  * Class:     org_druze_test_TestNative


  * Method:    sayHello


  * Signature: ()V


  */


  JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello


  (JNIEnv *, jobject);


  #ifdef __cplusplus


  }


  #endif


  #endif


  4.    创建C++解决方案


  此处以VS2008为例。


  新建一个VC++的Win32项目,选择如图所示的控制台应用程序。项目名称为NativeCode。


  点击确定后,再点击下一步,出现该页面,应用程序类型选择DLL,附加选项选择DLL


  5.    创建号工程之后,将org_druze_test_TestNative.h导入到工程里面,并创建名为source.cpp的源代码,内容如下:


  #include"org_druze_test_TestNative.h"


  #include<iostream>


  using namespace std;


  JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello(JNIEnv *env, jobject obj)


  {


  cout<<"Hello World!"<<endl;


  }


  6.    在工具->选项->项目和解决方案->VC++目录菜单中,平台选择Win32,选择“显示以下内容的目录”为“包含文件”,导入jni.h和jni_md.h的路径。


  7.    编译,生成NativeCode.dll,并将其copy到环境变量PATH的路径下。


  8.    修改TestNative.java


  package org.druze.test;


  publicclass TestNative {


  publicnativevoid sayHello();


  publicstaticvoid main(String[] args) {


  // 加载动态连接库DLL,如果没有找到的话,则会在运行时报错


  System.loadLibrary("NativeCode");


  TestNative tnt = new TestNative();


  tnt.sayHello();


  }


  publicvoid sayHello2(){


  System.out.println("Say Hello From Java");


  }


  }


  运行,显示“Hello World!”


  9.    注意头文件jni.h和jni_md.h可以直接导入到工程中也可以。


  10.注意NativeCode.dll必须放置在java命令能访问的路径中。


}
======================================================================
3.
21点难点在和服务器交互的部分是java语言写的,在编码的过程中需要不断的
使用java和c++互相调用,基本思路是这样的
在java里面写好c++要调用的函数,然后又javah 编译成.h文件,导入vs2008
编译外包可用的dll文件
java通过dll便能调用c++里面所有的方法,在cocos2d-x工程里面,导入java包
和dll文件,这样就能完成在pc上调试
--------------------------------------------------------------------
我们最终的目的是把cocos2d-x运行在android手机里面,android是不能支持dll
所以,我们最后必须把java调用c++的方法 编译成.h后,通过用Cygwin编译成
.so包,这样便能在android工程里面完成java和c++的互调


======================================================================
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值