рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдХреЛрд░реЛрдирд╛ рдиреЗрдЯрд┐рд╡ - рдХреЛрд░реЛрдирд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдЧреЗрдо рдореЗрдВ рдХрд╕реНрдЯрдо рдЬрд╛рд╡рд╛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдХреЛрд░реЛрдирд╛ рдЧреЗрдо рдЗрдВрдЬрди рдЖрдкрдХреЛ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЬреЛ рдПрдкреАрдЖрдИ рд╡реЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдХреЛрд░реЛрдирд╛ рдиреЗрдЯрд┐рд╡ рд╣реИ , рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдореВрд▓ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдпрд╣ рд▓реЗрдЦ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдХреЛрд░реЛрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛


рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд▓реЗрдЦ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛, рд▓реБрдЖ рдФрд░ рдХреЛрд░реЛрдирд╛ рдЗрдВрдЬрди рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ


рдХреЛрд░реЛрдирд╛ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП


рдХреЛрд░реЛрдирд╛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рднреА рд╣реЛрддрд╛ рд╣реИ: рдиреЗрдЯрд┐рд╡ \ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ \ рдПрдкред рдкреВрд░реЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд╛рдо рдкрд░ рдирд╛рдо рджреЗрдВред


рдЦрд╛рдХрд╛ рдЕрдиреБрдХреВрд▓рди


рдиреЛрдЯ: рдореИрдВрдиреЗ рдХреЛрд░реЛрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╡реАрдирддрдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ - 2017.3184 ред рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЕрдзреНрдпрд╛рдп рд╕реЗ рдХреБрдЫ рддреИрдпрд╛рд░рд┐рдпреЛрдВ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред


рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдВрджрд░ 2 рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдЪрд╛рд╣рд┐рдП: рдХреЛрд░реЛрдирд╛ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб


рдХреЛрд░реЛрдирд╛ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ, Images.xcassets рдФрд░ LaunchScreen.storyboardc рд╣рдЯрд╛рдПрдВ - рд╣рдореЗрдВ рдЗрди рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред Main.lua рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо рд╕рднреА рдХреЛрдб рднреА рд╣рдЯрд╛рддреЗ рд╣реИрдВ - рд╣рдо рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрд░реЛрдирд╛ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдВ


рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реЙрдЗрдб рдлрд╝реЛрд▓реНрдбрд░ рдПрдХ рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕реЗ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрджреЗрд╢ "рдЧреНрд░реИрдбрд▓ рд╕рд┐рдВрдХ рдлреЗрд▓" рд╣реЛрдЧрд╛ред Build.gradle рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛


рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд┐рд▓реНрдбрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВред рдореИрдВрдиреЗ рднреА рдХреНрд▓рд╛рд╕рдкреИрде рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 'com.android.tools.build:gradle' рдХреЛ рдПрдХ рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ред


рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдб рдХреЛрдб
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.1.3' } repositories { jcenter() google() } } allprojects { repositories { jcenter() google() } } task clean(type: Delete) { delete rootProject.buildDir } 

рдЕрдЧрд▓рд╛ рдХрджрдо gradle-wrapper.properties рдХреЛ рдмрджрд▓рдирд╛ рд╣реИред рдЖрдк рд╡рд┐рддрд░рдгрдпреВрдПрд▓ рдореЗрдВ рдЧреНрд░реЗрдбреЗрд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрджрд▓рдХрд░ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рджреЗрдВред


gradle-wrapper.properties


рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдкрдХреЛ рдРрдк рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП build.gradle рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: cleanAssets рдореЗрдВ рдЖрдкрдХреЛ рдбрд┐рд▓реАрдЯ рд▓рд╛рдЗрди "$ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдбрд┐рд░ / рдмрд┐рд▓реНрдб / рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ / рдЬреЙрдиреАрд▓рд┐рдм" рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдЖрдкрдХреЛ рдХреЛрдИ рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ ( рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ ) рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдЕрдм рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдлрд▓ рд╣реИ, рдЕрдкреНрд░рдЪрд▓рд┐рдд рдмрд┐рд▓реНрдбрдЯреВрд▓рд╡реЗрд╢рди рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкреБрд░рд╛рдиреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред


рдЕрдм рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╣рдо 2 рдореЙрдбреНрдпреВрд▓ рджреЗрдЦрддреЗ рд╣реИрдВ: рдРрдк рдФрд░ рдкреНрд▓рдЧрдЗрдиред рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (com.mycompany.app) рдФрд░ рдкреНрд▓рдЧрдЗрди (plugin.library) рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВред


рдХреЛрдб рдореЗрдВ рдЖрдЧреЗ, рдкреНрд▓рдЧрдЗрди plugin.habrExamplePlugin рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛


рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ LuaLoader рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ - рдпрд╣ рд▓реБрдЖ рдХреЛрдб рд╕реЗ рдХреЙрд▓ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред


LuaLoader рдХреЛрдб
 package plugin.habrExamplePlugin; import com.naef.jnlua.JavaFunction; import com.naef.jnlua.LuaState; @SuppressWarnings({"WeakerAccess", "unused"}) public class LuaLoader implements JavaFunction { @Override public int invoke(LuaState luaState) { return 0; } } 

рд▓реБрдЖ рдХреЛрдб рд╕реЗ рдкреНрд▓рдЧрдЗрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдХреЛрд░реЛрдирд╛ рдиреЗрдЯрд┐рд╡ рдЬрд╛рд╡рд╛ рдФрд░ рд▓реБрдЖ рдХреЛрдб рдХреЗ рдмреАрдЪ рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЬрдирд▓реБрдЖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред LuaLoader jnlua.JavaFunction рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдЗрдирд╡реЛрдХ рд╡рд┐рдзрд┐ lua рдХреЛрдб рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, LuaLoader.invoke рдкрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ рдФрд░ main.uaua рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдПрдВ


  @Override public int invoke(LuaState luaState) { Log.d("Corona native", "Lua Loader invoke called"); return 0; } 

 local habrPlugin = require("plugin.habrExamplePlugin") print("test:", habrPlugin) 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд▓реЙрдЧ рдХреЗ рдмреАрдЪ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 2 рд▓рд╛рдЗрдиреЗрдВ рджреЗрдЦреЗрдВрдЧреЗ:


рдбреА / рдХреЛрд░реЛрдирд╛ рдореВрд▓: рд▓реБрдЖ рд▓реЛрдбрд░ рдЖрд╣реНрд╡рд╛рди
рдореИрдВ / рдХреЛрд░реЛрдирд╛: рдкрд░реАрдХреНрд╖рдг рд╕рд╣реА рд╣реИ

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗ рдкреНрд▓рдЧрдЗрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд░рд┐рдЯрд░реНрди рдХреА рд╕рд╣реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рдЬрд╛рд╡рд╛ рдХреЛрдб рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реБрдЖ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред


рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо jnlua.NamedJavaFunction рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдФрд░ рдХреЛрдИ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 class HelloHabrFunction implements NamedJavaFunction { @Override public String getName() { return "helloHabr"; } @Override public int invoke(LuaState L) { Log.d("Corona native", "Hello Habr!"); return 0; } } 

рд▓реБрдЖ рдореЗрдВ рд╣рдорд╛рд░реЗ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо LuaState.register рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:


 public class LuaLoader implements JavaFunction { @Override public int invoke(LuaState luaState) { Log.d("Corona native", "Lua Loader invoke called"); String libName = luaState.toString(1); //      (  require) NamedJavaFunction[] luaFunctions = new NamedJavaFunction[]{ new HelloHabrFunction(), //     }; luaState.register(libName, luaFunctions); //   ,     //  1        lua . //     require      , require     return 1; } 

рдЗрд╕ рдХреЛрдб рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


LuaState, рдЗрдирд╡реЛрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ Lua рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рдПрдХ рдЖрд╡рд░рдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ (рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдВ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдЧрд▓рдд рдбрд╛рд▓реВрдВ)ред C рд╕реЗ рд▓реБрдЖ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, LuaState C рдореЗрдВ lua_State рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реИред


рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд▓реВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЬрдВрдЧрд▓ рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореИрдВ рдореИрдиреБрдЕрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ , рдж рдПрдкреНрд▓реАрдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде


рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо LuaState рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓реБрдЖ рдХреЛрдб рд╕реЗ рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд░рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ LuaLoader рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ ("plugin.habrExamplePlugin")ред


рдЖрд╣реНрд╡рд╛рди рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдЕрдВрдХ рд╕реНрдЯреИрдХ рд╕реЗ рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ рд▓реМрдЖ рдХреЛрдб рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдХрд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрдИ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ


рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдирд╛


рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕реНрдХрд░рдг:


  luaState.register(libName, luaFunctions); //   ,       luaState.pushString("0.1.2"); //     luaState.setField(-2, "version"); //   version   . 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдордиреЗ -2 рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧрд┐рдирддреА рд╕реНрдЯреИрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред -1 рд╕реНрдЯреНрд░рд┐рдВрдЧ "0.1.2" рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ (рд▓реВрдЖ рдореЗрдВ, рдЗрдВрдбреЗрдХреНрд╕ рдПрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)ред


рд╕реНрдЯреИрдХ рдХреЛ рд░реЛрдХрдирд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ luaState.pop (1) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ - рд╕реНрдЯреИрдХ рд╕реЗ 1 рддрддреНрд╡ рдлреЗрдВрдХрддрд╛ рд╣реИред


рдлреБрд▓ рд▓реБрдЖрдЙрд▓реНрд▓рд░ рдХреЛрдб
 @SuppressWarnings({"WeakerAccess", "unused"}) public class LuaLoader implements JavaFunction { @Override public int invoke(LuaState luaState) { Log.d("Corona native", "Lua Loader invoke called"); String libName = luaState.toString(1); //      (  require) NamedJavaFunction[] luaFunctions = new NamedJavaFunction[]{ new HelloHabrFunction(), //     }; luaState.register(libName, luaFunctions); //   ,     luaState.register(libName, luaFunctions); //   ,       luaState.pushString("0.1.2"); //     luaState.setField(-2, "version"); //   version   . //  1        lua . //     require      , require     return 0; } } 

рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг


рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдХрдИ рддрд╛рд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрд┐рд▓реНрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдореЗрдЯрддрд╛ рд╣реИ

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:


 class StringJoinFunction implements NamedJavaFunction{ @Override public String getName() { return "stringJoin"; } @Override public int invoke(LuaState luaState) { int currentStackIndex = 1; StringBuilder stringBuilder = new StringBuilder(); while (!luaState.isNone(currentStackIndex)){ String str = luaState.toString(currentStackIndex); if (str != null){ //toString  null  non-string  non-number,  stringBuilder.append(str); } currentStackIndex++; } luaState.pushString(stringBuilder.toString()); return 1; } } 

рд▓реБрдЖ рдореЗрдВ рдЙрдкрдпреЛрдЧ:


 local joinedString = habrPlugin.stringJoin("this", " ", "was", " ", "concated", " ", "by", " ", "Java", "!", " ", "some", " ", "number", " : ", 42); print(joinedString) 

рдХрдИ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг

рд╡рд░реНрдЧ рдпреЛрдЧ рд▓рд╛рдЧреВ рдирд╛рдордЬрд╡рд╛рдлрдВрдХреНрд╢рди {
рдЕрд╡рд╣реЗрд▓рдирд╛
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ getName () {
рд╡рд╛рдкрд╕реА "рдпреЛрдЧ";
}


 @Override public int invoke(LuaState luaState) { if (!luaState.isNumber(1) || !luaState.isNumber(2)){ luaState.pushNil(); luaState.pushString("Arguments should be numbers!"); return 2; } int firstNumber = luaState.toInteger(1); int secondNumber = luaState.toInteger(1); luaState.pushInteger(firstNumber + secondNumber); return 1; } 

}


рдЬрд╛рд╡рд╛ рдкрд░рд╛рд╡рд░реНрддрди - рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рд▓реБрдЖ рдореЗрдВ рдХрд░реЗрдВ


Jnlua рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ JavaReflector рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдПрдХ рдЬрд╛рд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рд▓реБрдЖ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд▓реБрдЖ рдХреЛрдб рджреЗ рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:


рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг


 @SuppressWarnings({"unused"}) public class Calculator { public int sum(int number1, int number2){ return number1 + number2; } public static int someStaticMethod(){ return 4; } } 

рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛


  luaState.pushJavaObject(new Calculator()); luaState.setField(-2, "calc"); luaState.pop(1); 

рд▓реБрдЖ рдореЗрдВ рдЙрдкрдпреЛрдЧ:


 local calc = habrPlugin.calc print("call method of java object", calc:sum(3,4)) print("call static method of java object", calc:getClass():someStaticMethod()) 

рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдореЗрдВ рдХреЛрд▓рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рддрдм рдореИрдВрдиреЗ рдкрд░рд╛рд╡рд░реНрддрдХ рдХреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛: рдпрджрд┐ рд╣рдо рд▓реБрдЖ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ getClass () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреА рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди getClass () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХреЗ рдмрд╛рдж, рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╣реА рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:


 print("call method of java object", calc:sum(3,4)) -- ok print("exception here", calc:someStaticMethod()) --   "com.naef.jnlua.LuaRuntimeException: no method of class plugin.habrExamplePlugin.Calculator matches 'someStaticMethod()'" print("call static method of java object", calc:getClass():someStaticMethod()) -- ok print("hmm", calc:someStaticMethod()) --    getClass         

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, getClass () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реАрдзреЗ рд▓реБрдЖ рдореЗрдВ рдирдИ рд╡рд╕реНрддреБрдПрдБ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 local newInstance = calc:getClass():new() 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ "java.lang.IllegalArgumentException: рдЕрд╡реИрдз рдкреНрд░рдХрд╛рд░" рд╕реЗрдЯрдлрд┐рд▓реНрдб рдХреЗ рдЕрдВрджрд░ рдореЙрдбреНрдпреВрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ Calculator.class рдХреЛ рдирд╣реАрдВ рдмрдЪрд╛ рд╕рдХрд╛ред


рдордХреНрдЦреА рдкрд░ рд▓реБрдЖ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрдирд╛рдирд╛ рдФрд░ рдХреЙрд▓ рдХрд░рдирд╛


рдпрд╣ рдЦрдВрдб рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рддрд╛рдЬ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди jnlua.LuaState рдЖрдкрдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд▓реБрдЖ рдХреЛрдб рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


 class CreateDisplayTextFunction implements NamedJavaFunction{ //    API  private static String code = "local text = ...;" + "return display.newText({" + "text = text," + "x = 160," + "y = 200," + "});"; @Override public String getName() { return "createText"; } @Override public int invoke(LuaState luaState) { luaState.load(code,"CreateDisplayTextFunction code"); //    ,     luaState.pushValue(1); //        luaState.call(1, 1); //   ,      1 ,    1 return 1; } } 

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рдорд╛рди LuaLoader.invoke рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ


рд▓реБрдЖ рдореЗрдВ рдХреЙрд▓:


 habrPlugin.createText("Hello Habr!") 

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдХрд╛ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреА рд╕рднреА рдореВрд▓ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдПрдХрдорд╛рддреНрд░ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХреЛрд░реЛрдирд╛ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ (рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╣реИ, рдПрдореБрд▓реЗрдЯрд░ рдпрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬрд┐рд╕рдореЗрдВ рдмрд┐рд▓реНрдб + рдЗрдВрд╕реНрдЯреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)


рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ


  1. рдЬреАрдердм рдкрд░ рдкреВрд░реНрдг рдХреЛрдб рдЙрдкрд▓рдмреНрдз рд╣реИ


  2. рдХреЛрд░реЛрдирд╛ рдиреЗрдЯрд┐рд╡ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди



3) jnlua рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕реЗ рдПрдХ ред рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдореЗрд░реА рдорджрдж рдХреАред

Source: https://habr.com/ru/post/hi416079/


All Articles