Android (NDK) JNI рдХреЙрд▓рдмреИрдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдСрдмреНрдЬрд░реНрд╡рд░- NDK рдФрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдкреИрдЯрд░реНрди, рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрд╛ EventBus рдпрд╛ Rx
.... рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓ рдЧрдпрд╛ "рдЕрдВрджрд░ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрд╡ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рднрд╛рдЧ рдирд╣реАрдВ рд╣реИрдВред" рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реИред
- рд░реВрд╕реА рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдЧреБрдбрд╝рд┐рдпрд╛ рдмрд╣реБрдд рдЧрд╣рд░рд╛рдИ рддрдХред рд╕рдЪ рдореЗрдВ, Orozco рдЬреБрдЖрди рдиреЗ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ рд░реВрд╕реА рдШреЛрдВрд╕рд▓реЗ рдХрд╛ рд╢рд┐рдХрд╛рд░ рдЧреБрдбрд╝рд┐рдпрд╛ рдХреНрдпрд╛ рд╣реИред
"рдпрд╣ рдмрдХрд╡рд╛рд╕ рд╣реИ, рдкреНрд░реЛрдлреЗрд╕рд░ рдЧреБрдЬрд░рд╛рддред" рдЗрд╕рдХреА рдЬрд░реВрд░рдд рдХрд┐рд╕реЗ рд╣реИ - рдЗрд╕рд╕реЗ рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░рдиреЗ рдХреАред
"рдж рдПрдВрдб рдСрдлрд╝ рдж рд░реЗрдирдмреЛ" рд╡рд┐рдВрдЬ рд╡рд░реНрдирд░
рдХрд╛рдлреА Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдВ рдЬреЛ C ++ рдФрд░ Java рдХреЛрдб рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ C ++ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдХреНрд╕рд░ рдСрдбрд┐рдпреЛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдХрд╣реАрдВ рдЕрдВрджрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЧреИрд╕ рдФрд░ рдХреНрд▓рдЪ рдХреЗ рд╕рд╛рде рдмреНрд░реЗрдХ рдХреЛ рдКрдкрд░ рдХреА рдУрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдордЬрд╝реЗрджрд╛рд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ред
рдЦреИрд░, ReactiveX рдХреЗ рдмрд╛рдж рд╕реЗ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдкрдирд╛ рд╣рд╛рде рдирд╣реАрдВ рдмрджрд▓рдирд╛ рд╣реИ, рдФрд░ рдЬреЗрдПрдирдЖрдИ рдХрд╛рд▓рдХреЛрдард░реА рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ NDK рдХреЗ рд╕рд╛рде рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдСрдмреНрдЬрд░реНрд╡рд░ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рд╕рдордЭ рдкреБрд░рд╛рддрддреНрд╡рд╡рд┐рджреЛрдВ рдЬреЛ рд▓реЛрдЧ "рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ" рдмрдврд╝ рдЬрд╛рддреЗ рд╣реИрдВред
рддреЛ, рдХреБрдЫ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░реЗрдВред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА рдмрд╛рдЗрдХ рд▓рд┐рдЦрдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓реЗрдЧрд╛:
- рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП C ++ рдХреЛрдб рд╕реЗ рдкреЛрд╕реНрдЯрдмреИрдХ рдЬреИрд╕рд╛ рдХреБрдЫ;
- рдореВрд▓ рдХреЛрдб рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкреНрд░рдмрдВрдзрди, рдЕрд░реНрдерд╛рддреН, рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рднреЗрдЬрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдмрд╕реНрддрд┐рдпреЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
- рд╡рд┐рднрд┐рдиреНрди JVM рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ;
- рдФрд░ рдЗрд╕рд▓рд┐рдП рджреЛ рдмрд╛рд░ рдЙрдардиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдЕрдВрджрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗред
рдкреВрд░рд╛ рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рд▓реЗрдЦ рдЗрд╕рд╕реЗ рдХреЗрд╡рд▓ рдЕрдВрд╢ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЗрддрд┐рд╣рд╛рд╕ рдХрд╛ рдПрдХ рд╕рд╛
рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВ рдЖрд░рдПрдХреНрд╕ рдХреА рдмреИрдардХ рдореЗрдВ рдерд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдЪрдХрд┐рдд рдерд╛: рд░рд┐рдПрдХреНрдЯрд┐рд╡рдПрдХреНрд╕ рдХрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рд╣реИ рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
ReactiveX рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЧрддрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рддрдирд╛ рдЙрдЪрд┐рдд рд╣реИ; рдпрджрд┐ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдЧрддрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рд╣рдорд╛рд░реА рдмрд╛рдЗрдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣рд▓реНрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ (рдЬреИрд╕реЗ рдкреНрд░рд╡рд╛рд╣рд╢реАрд▓), рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдЧрдбрд╝рдмрдбрд╝рд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдЖрдкрдХреА рд╣реИрдВред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдПрдХ рд╕рд╛: рдСрдмреНрдЬрд░реНрд╡рд░- рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдкреИрдЯрд░реНрди рдПрдХ рдРрд╕рд╛ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд▓рд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрдирдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдЬреНрд╡рд▓рдВрдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЬрд┐рд╕рдореЗрдВ рднрд╛рд╖рд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ - рд╕реНрдореЙрд▓рдЯрд╛рдХ, рд╕рднреА рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдкреНрд░рднрд╛рд╡рд┐рдд рдЙрджреНрджреЗрд╢реНрдп-рд╕реАред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЖрдЗрдП DIY рдХреА рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкрд░рдВрдкрд░рд╛рдУрдВ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рдПрд▓рдИрдбреА рдмреНрд▓рд┐рдВрдХ рдХрд░реЗрдВ"ред рдпрджрд┐ рдЖрдк рдПрдВрдбреНрд░реЙрдЗрдб NDK рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬреЗрдПрдирдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд┐рд╕реА рднреА рдзрд╛рдЧреЗ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛ рд╡рд┐рдзрд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдо рдЕрдкрдиреЗ "рдСрдмреНрдЬрд░реНрд╡рд░" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реЗ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
рдпрд╣ рдПрдХ рдСрдЯреЛ рдЬреЗрдирд░реЗрдЯреЗрдб рддрд░реАрдХрд╛ рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА:
рдЕрдм рдЕрдкрдиреЗ рд▓рд┐рдПред рдкрд╣рд▓рд╛ рдЪрд░рдг nsubscribeListener
рд╡рд┐рдзрд┐ рд╣реИред
private native void nsubscribeListener(JNIListener JNIListener);
рдпрд╣ C ++ рдХреЛрдб рдХреЛ рдЬрд╛рд╡рд╛ рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ JNIListener.
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреЙрд▓рдмреИрдХ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ JNIListener.
public interface JNIListener { void onAcceptMessage(String string); void onAcceptMessageVal(int messVal); }
рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рдкреНрд░рднрд╛рд╡реА рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рднреА рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд▓рд┐рдВрдХ рдорд┐рд▓рддрд╛ рд╣реИред
Java_ua_zt_mezon_myjnacallbacktest_MainActivity_nsubscribeListener(JNIEnv *env, jobject instance, jobject listener) { env->GetJavaVM(&jvm);
рддреБрд░рдВрдд рддрд░реАрдХреЛрдВ рдХреА рд▓рд┐рдВрдХ рдЧрд┐рдиреЗрдВ рдФрд░ рд╕рд╣реЗрдЬреЗрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЙрд▓рдмреИрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
jclass clazz = env->GetObjectClass(store_Wlistener); jmethodID store_method = env->GetMethodID(clazz, "onAcceptMessage", "(Ljava/lang/String;)V"); jmethodID store_methodVAL = env->GetMethodID(clazz, "onAcceptMessageVal", "(I)V");
рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдбреЗрдЯрд╛ рдХреЛ ObserverChain
рдХреНрд▓рд╛рд╕ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
class ObserverChain { public: ObserverChain(jweak pJobject, jmethodID pID, jmethodID pJmethodID); jweak store_Wlistener=NULL; jmethodID store_method = NULL; jmethodID store_methodVAL = NULL; };
рдбрд╛рдпрдиреЗрдорд┐рдХ рдРрд░реЗ рд╕реНрдЯреЛрд░_рд╡реЗрд▓реНрдЯрд░рдиреЗрд╡рд░_рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХреЛ рд╕реЗрд╡ рдХрд░реЗрдВред
ObserverChain *tmpt = new ObserverChain(store_Wlistener, store_method, store_methodVAL); store_Wlistener_vector.push_back(tmpt);
рдЕрдм рдЬрд╛рд╡рд╛ рдХреЛрдб рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдиреЙрдирдЯреЗрдХреНрд╕реНрдЯ рдореЗрдердб рдХреЛ рднреЗрдЬреЗ рдЧрдП рдореЗрд╕реЗрдЬ рдХреЛ рд╕рднреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
private native void nonNext(String message);
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
Java_ua_zt_mezon_myjnacallbacktest_MainActivity_nonNext(JNIEnv *env, jobject instance, jstring message_) { txtCallback(env, message_); }
рд╕рдорд╛рд░реЛрд╣ txtCallback (env, message_); рд╕рднреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред
void txtCallback(JNIEnv *env, const _jstring *message_) { if (!store_Wlistener_vector.empty()) { for (int i = 0; i < store_Wlistener_vector.size(); i++) { env->CallVoidMethod(store_Wlistener_vector[i]->store_Wlistener, store_Wlistener_vector[i]->store_method, message_); } } }
C ++ рдпрд╛ C рдХреЛрдб рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо test_string_callback_fom_c рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
void test_string_callback_fom_c(char *val)
рд╡рд╣ рд╢реБрд░реВ рд╕реЗ рд╣реА рд╕рд╣реА рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рдмрд╕реНрдХреНрд░рд╛рдЗрдмрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред
if (store_Wlistener_vector.empty()) return;
рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА txtCallback рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
void test_string_callback_fom_c(char *val) { if (store_Wlistener_vector.empty()) return; __android_log_print(ANDROID_LOG_VERBOSE, "GetEnv:", " start Callback to JNL [%d] \n", val); JNIEnv *g_env; if (NULL == jvm) { __android_log_print(ANDROID_LOG_ERROR, "GetEnv:", " No VM \n"); return; }
MainActivity рдореЗрдВ рд╣рдо рджреЛ рдЯреЗрдХреНрд╕реНрдЯрд╡реНрдпреВ рдФрд░ рдПрдХ EditView рдмрдирд╛рддреЗ рд╣реИрдВред
<TextView android:id="@+id/sample_text_from_Presenter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:padding="25dp" android:text="Hello World!from_Presenter" app:layout_constraintBottom_toTopOf="parent" app:layout_constraintEnd_toStartOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/sample_text_from_act" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Hello World from_ac!" app:layout_constraintBottom_toTopOf="parent" app:layout_constraintStart_toStartOf="@+id/sample_text_from_Presenter" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/edit_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toTopOf="parent" app:layout_constraintStart_toStartOf="@+id/sample_text_from_act" app:layout_constraintTop_toTopOf="parent" />
OnCreate рдореЗрдВ, рд╣рдо View рдХреЛ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рдБрдзрддреЗ рд╣реИрдВ рдФрд░ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм EditText рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕рдВрджреЗрд╢ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
mEditText = findViewById(R.id.edit_text); mEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { nonNext(charSequence.toString()); } @Override public void afterTextChanged(Editable editable) { } }); tvPresenter = (TextView) findViewById(R.id.sample_text_from_Presenter); tvAct = (TextView) findViewById(R.id.sample_text_from_act);
рд╣рдо рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╢реБрд░реВ рдФрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ:
mPresenter = new MainActivityPresenterImpl(this); nsubscribeListener((MainActivityPresenterImpl) mPresenter); nlistener = new JNIListener() { @Override public void onAcceptMessage(String string) { printTextfrActObj(string); } @Override public void onAcceptMessageVal(int messVal) { } }; nsubscribeListener(nlistener);
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдкреВрд░рд╛ рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб GitHub https://github.com/NickZt/MyJNACallbackTest рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ
рдЖрдЗрдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдХреНрдпрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИред