COCOS2DX游戏Luaj调用Android方法里的数据
网上的基本上都是在搬运,看了和没看一样
然后自己在实际应用中遇到了太多离谱的问题,这里做一下记录
Android部分
/**
* 与lua交互
*
* @return 数据返回给lua
*/
public static String getUserId() {
return userInfoId; //这里是全局的String数据
//为什么不使用传参呢?因为我发现传参的方式会导致应用崩溃或者是lua签名报错,研究了一天找到的问题
}
Lua部分
function LoginProxy:GetUserId()
local luaj = require "android.zhcn.scripts.cocos2d.luaj.lua" --网上教程都是直接写路径,我这边写路径报错,解决办法是加后缀
--这里是游戏运行的AppActivity 这里是Android那边需要调用的方法 {}这个是tab
local ok, ret = luaj.callStaticMethod("org/cocos2dx/cpp/AppActivity", "getUserId", {}, "()Ljava/lang/String;")
--这个是签名,也就是要对应Android方法里面的参数和返回值来写
if not ok then --如果为假取反
print("==== luaj error ==== : ", ret) -- 打印 false
return false
else
print("==== The JNI return is:", ret) --为真的话打印获取的数据,否则返回错误代码
return ret
end
end
问题解决:
最终发现是Android方法那边传了参数
这种写法,别人的教程都是这样写的,我这样写就签名错误或者闪退
public static String getUserToken(String userInoToken) {
return userInfoToken;
}
结束
签名使用方式
签名 解释
()V 参数:无,返回值:无
(I)V 参数:int,返回值:无
(Ljava/lang/String;)Z 参数:字符串,返回值:布尔值
(IF)Ljava/lang/String; 参数:整数、浮点数,返回值:字符串
如果是带参数和返回值(return)的方法 那么括号里外都要写 Ljava/lang/String;
例: (Ljava/lang/String;)Ljava/lang/String; (注意有个符号 ; )
对应Android方法的签名类型:
I 整数,或者 Lua function
F 浮点数
Z 布尔值
Ljava/lang/String; 字符串
V Void 空,仅用于指定一个 Java 方法不返回任何值
错误代码含义:
错误代码 描述
-1 不支持的参数类型或返回值类型
-2 无效的签名
-3 没有找到指定的方法
-4 Java 方法执行时抛出了异常
-5 Java 虚拟机出错
-6 Java 虚拟机出错