NativeManager.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. export default class NativeManager {
  2. static JavaClassName: string;
  3. static JavaArgTypeDict: { Number: string; String: string; Boolean: string; Float: string; };
  4. static OCClassName: string;
  5. static Init(){
  6. this.OCClassName = "RootViewController";
  7. this.JavaClassName = "org/cocos2dx/javascript/NativeMgr";
  8. this.JavaArgTypeDict = {"Number":"I", "String":"Ljava/lang/String;", "Boolean":"Z", "Float":"F"};
  9. }
  10. //调用native平台接口
  11. //funName:函数名
  12. //参数顺序列表argList=[{"Name":"Title", "Value":"xx"},{"Name":"Description", "Value":"xx"},{"Name":"URL", "Value":"xx"}]
  13. //returnType 返回值类型
  14. static CallToNative(funName: string, argList: any, returnType: string){
  15. if(!cc.sys.isNative){
  16. return
  17. }
  18. if(cc.sys.platform == cc.sys.ANDROID){
  19. this.CallToJava(funName, argList, returnType);
  20. }
  21. else if(cc.sys.platform == cc.sys.IPHONE || cc.sys.platform == cc.sys.IPAD){
  22. this.CallToOC(funName, argList);
  23. }
  24. }
  25. /**
  26. * 调用java接口
  27. * javaFunName MyAPIManager.java 对应函数名
  28. * argList argList 函数接受的参数列表
  29. * returnType returnType 函数返回值类型
  30. */
  31. static CallToJava(javaFunName: string, argList: any, returnType: string){
  32. //jsb.reflection.callStaticMethod('org/cocos2dx/javascript/SDKManager',
  33. //'OnWeChatShare','(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V',"当当猫","当当猫分享","www.ddmh5.com","0");
  34. let javaFunArgList = [];
  35. let javaFunSign = "(";
  36. let count = argList.length;
  37. for(let index=0; index<count; index++){
  38. let argInfo = argList[index];
  39. if(!argInfo.hasOwnProperty("Value")){
  40. console.error("CallToJava argInfo error", argInfo);
  41. return
  42. }
  43. let value = argInfo["Value"];
  44. let argType = Object.prototype.toString.call(value).slice("[object ".length, -1);
  45. let javaType = this.JavaArgTypeDict[argType];
  46. // console.log("javaType === >",value,javaType)
  47. if(!javaType){
  48. console.error("CallToJava(%s, %j) error", javaFunName, argList);
  49. return
  50. }
  51. javaFunSign += javaType;
  52. // console.log("javaFunSign == >"+javaFunSign)
  53. javaFunArgList.push(value);
  54. }
  55. let returnValueType = this.JavaArgTypeDict[returnType];
  56. //如果有返回值
  57. if(returnValueType){
  58. javaFunSign += ")" + returnValueType;
  59. }
  60. else{
  61. javaFunSign += ")V";
  62. }
  63. javaFunArgList.unshift(this.JavaClassName, javaFunName, javaFunSign);
  64. try{
  65. return jsb.reflection.callStaticMethod.apply(this, javaFunArgList);
  66. }
  67. catch (error){
  68. console.error("CallToJava(%s,%s,%s) error:%s", javaFunName, JSON.stringify(argList), returnType, error.stack);
  69. }
  70. }
  71. /**
  72. * 调用oc接口
  73. * javaFunName MyAPIManager.java 对应函数名
  74. * argList argList 函数接受的参数列表
  75. * returnType returnType 函数返回值类型
  76. */
  77. static CallToOC(ocFunName, argList){
  78. //jsb.reflection.callStaticMethod(this.OCClassName,''OnWeChatShareWithTitle: Description: URL:Type:','红中麻将','红中麻将分享','www.ddmh5.com',"0");
  79. let ocFunArgList = [];
  80. ocFunArgList.push(this.OCClassName);
  81. let funString = ocFunName;
  82. let count = argList.length;
  83. for(let index=0; index < count; index++){
  84. let argInfo = argList[index];
  85. let name = argInfo["Name"];
  86. let value = argInfo["Value"];
  87. if(!name){
  88. console.error("CallToOC(%s) argInfo error", ocFunName, argInfo);
  89. return
  90. }
  91. if(index){
  92. funString += name + ":";
  93. }
  94. else{
  95. funString += "With" + name + ":";
  96. }
  97. ocFunArgList.push(value);
  98. }
  99. //插入函数签名
  100. ocFunArgList.splice(1, 0, funString);
  101. try{
  102. console.log("javaFunArgList CallToOC(%s)", JSON.stringify(ocFunArgList));
  103. return jsb.reflection.callStaticMethod.apply(this, ocFunArgList);
  104. }
  105. catch (error){
  106. console.error("CallToOC(%s,%s) error:%s", ocFunName, JSON.stringify(argList), error.stack);
  107. }
  108. }
  109. }