My native method isn’t being found by the Java end
My subclass of Activity has:
Code:
package com.dumbdumber.myproject;
public class SubActivity extends SDLActivity {//which extends Activity
private static native void nativeInitGPGS(SubActivity act);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
nativeInitGPGS(this);
}
While main.cpp begins, after first preprocessing directives:
Code:
extern “C”
{
JNIEXPORT void
Java_com_dumbdumber_myproject_SubActivity_nativeInitGPGS(JNIEnv* env, jobject thiz, jobject activity)
{
I get:
10-17 16:12:38.051: D/dalvikvm(4980): Trying to load lib /data/data/com.dumbdumber.myproject/lib/libmain.so 0x423849c8
10-17 16:12:38.055: D/dalvikvm(4980): Added shared lib /data/data/com.dumbdumber.myproject/lib/libmain.so 0x423849c8
10-17 16:12:38.060: V/SDL(4980): onCreate():null
10-17 16:12:38.087: W/dalvikvm(4980): No implementation found for native Lcom/dumbdumber/myproject/SubActivity;.nativeInitGPGS:(Lcom/dumbdumber/myproject/SubActivity;)V
10-17 16:12:38.108: D/AndroidRuntime(4980): Shutting down VM
10-17 16:12:38.108: W/dalvikvm(4980): threadid=1: thread exiting with uncaught exception (group=0x41b73908)
10-17 16:00:52.456: E/AndroidRuntime(4699): FATAL EXCEPTION: main
10-17 16:00:52.456: E/AndroidRuntime(4699): java.lang.UnsatisfiedLinkError: Native method not found: com.dumbdumber.myproject.SubActivity.nativeInitGPGS:(Lcom/dumbdumber/myproject/SubActivity;)V
10-17 16:00:52.456: E/AndroidRuntime(4699): at com.dumbdumber.myproject.SubActivity.nativeInitGPGS(Native Method)
10-17 16:00:52.456: E/AndroidRuntime(4699): at com.dumbdumber.myproject.SubActivity.onCreate(SubActivity)
I believe the native implementation can be placed anywhere and automagickly picked up. I’ve tried placing the C implementation in another cpp body, instead of main.cpp but nothing changes.
Here is my Android.mk
Code:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := …/SDL
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/…/include
LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c
main.cpp
#Other stuff removed for clarity
LOCAL_SHARED_LIBRARIES := SDL2_image
SDL2
SDL2_ttf
LOCAL_WHOLE_STATIC_LIBRARIES += gpg_static
LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog -lz
include $(BUILD_SHARED_LIBRARY)
While I leave loading of the shared libraries to SDLActivity
static {
System.loadLibrary(“SDL2”);
System.loadLibrary(“SDL2_image”);
System.loadLibrary(“SDL2_ttf”);
System.loadLibrary(“main”);
}
I’ve remembered to run ndk-build (twice) in the jni directory and am attempting to run on my phone.
I’ve run my libmain.so through a hexeditor and can confirm it exists, also here’s the first six lines output from nm from the NDK
Code:
U IMG_Init
U IMG_Load
U IMG_Quit
00065454 T JNI_OnLoad
0005c208 T Java_org_libsdl_app_SDLActivity_nativeInit
0006851c T Java_com_dumbdumber_myproject_SubActivity_nativeInitGPGS