I want to call native code from java in case of native activity.
Suppose I have game engine in engine.so. Now I want to add speech recognition. I added java wrapper-class and start speech recognition from native code via jni. I want to return result to native side. Following jni examples I declared native method in java class and call it when recognition finished:
public native void onSpeechRecognized ( String value );
I implemented this method in engine.so. Of course I don't load engine.so with System.loadLibrary as it's already loaded. But java code doesn't sees method implementation, reporting:
FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: onSpeechRecognized
at com.company.appname.SpeechRecognizerWrapper.onSpeechRecognized(Native Method)
at com.company.appname.SpeechRecognizerWrapper$SpeechRecognitionListener.onResults(SpeechRecognizerWrapper.java:92)
at android.speech.SpeechRecognizer$InternalListener$1.handleMessage(SpeechRecognizer.java:428)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
nm utility shows that engine.so contains Java_com_company_appname_SpeechRecognizerWrapper_onSpeechRecognized
Signature is generated with javah.
My Android.mk
PROJ_PATH := $(call my-dir)
LIB_PATH := $(PROJ_PATH)/../../../../../Smart/Lib
include $(LIB_PATH)/Log/Projects/android/jni/Android-prebuilt.mk
...
LOCAL_PATH := $(PROJ_PATH)/../../../../../Smart/Smart
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := \
$(PROJ_PATH)/../../../../../Smart \
$(LIB_PATH)/Hash
LOCAL_MODULE := smart
LOCAL_SRC_FILES := Animation/TextureAnimation.cpp
LOCAL_SRC_FILES += Base/Director.cpp
...
LOCAL_CFLAGS += -DNDEBUG -O3 -mcpu=cortex-a8 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -std=gnu++11
LOCAL_LDLIBS := -llog -landroid -lGLESv2 -lEGL -lOpenSLES
LOCAL_STATIC_LIBRARIES := android_native_app_glue Slb freetype Image FileSystem Noise Log Math Threads SharedPtr vmath png jpeg ScriptEngine QuestEngine Time tremolo
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
So why java side doesn't sees native side implementation?