当前位置: 首页 > 工具软件 > LuaJ > 使用案例 >

Luaj调用Android方法遇到的坑记录

楚奇逸
2023-12-01

网上的基本上都是在搬运,看了和没看一样

然后自己在实际应用中遇到了太多离谱的问题,这里做一下记录

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 虚拟机出错
 类似资料: