Java端没有找到我的本机方法

时间:2014-10-17 15:32:53

标签: java android c++ android-ndk java-native-interface

Java端没有找到我的本机方法

我的Activity的子类有:

package com.dumb_dumber.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);
    }

main.cpp开始时,在第一个预处理指令之后:

extern "C"
{
JNIEXPORT void
Java_com_dumb_1dumber_myproject_SubActivity_nativeInitGPGS(JNIEnv* env, jobject thiz, jobject activity)
{

我知道我已经插入一个1来使它成为dumb_1dumber,这就是Javah告诉我要做的事情并且过去曾使用过不同的框架。我试过删除1没有效果。

我仍然得到:

10-17 16:12:38.051:D / dalvikvm(4980):尝试加载lib /data/data/com.dumb_dumber.myproject/lib/libmain.so 0x423849c8
10-17 16:12:38.055:D / dalvikvm(4980):添加了共享库/data/data/com.dumb_dumber.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):找不到本机Lcom / dumb_dumber / myproject / SubActivity的实现; .nativeInitGPGS:(Lcom / dumb_dumber / myproject / SubActivity;)V
10-17 16:12:38.108:D / AndroidRuntime(4980):关闭VM
10-17 16:12:38.108:W / dalvikvm(4980):threadid = 1:线程退出未捕获异常(组= 0x41b73908)
10-17 16:00:52.456:E / AndroidRuntime(4699):致命异常:主要
10-17 16:00:52.456:E / AndroidRuntime(4699):java.lang.UnsatisfiedLinkError:找不到本机方法:com.dumb_dumber.myproject.SubActivity.nativeInitGPGS:(Lcom / dumb_dumber / myproject / SubActivity;)V
10-17 16:00:52.456:E / AndroidRuntime(4699):at com.dumb_dumber.myproject.SubActivity.nativeInitGPGS(Native Method)
10-17 16:00:52.456:E / AndroidRuntime(4699):at com.dumb_dumber.myproject.SubActivity.onCreate(SubActivity)

我相信本机实现可以放在任何地方并自动拾取。我已经尝试将C实现放在另一个cpp体中,而不是main.cpp,但没有任何变化。

这是我的Android.mk

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)

我将共享库加载到SDLActivity

static {
    System.loadLibrary("SDL2");
    System.loadLibrary("SDL2_image");
    System.loadLibrary("SDL2_ttf");
    System.loadLibrary("main");
}

我花了很多时间来到这里,我已经建立了很多很好的cpp,期待一个令人满意的解决方案,但我意识到这可能是不可能的,至少不是我。我在jni目录中remembered to run ndk-build(两次)并尝试在手机上运行。

我通过hexeditor运行我的libmain.so并确认它存在,_1就位。我可以尝试的更多,但有时间尝试一点意味着我可以尝试删除下划线。现在再试一次,没有区别。

这是nm输出的前六行,谢谢Alex,

    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

                            ^^^^^^^^^ 

更新再次感谢Chris,myproject在您标记我的原始活动类型名称/ jobject参数后被忽略。

1 个答案:

答案 0 :(得分:2)

Java_com_dumb_1dumber_myproject_SubActivity_nativeInitGPGS

不符合

package com.dumb_dumber.myproject;

public class SubActivity extends SDLActivity {//which extends Activity

   private static native void nativeInitGPGS(AnagrActivity act);

因此找不到实现错误。

删除无关的" 1"来自您的原生方法名称。另外,请考虑选择更合理的包名称,不要使用下划线

  
    

我通过hexeditor运行我的libmain.so并确认它存在,_1就位

  

确实如此。虽然您的错误跟踪清楚地显示链接器正在寻找没有该无关字符的函数。也许这是Java与Dalvik或ART之间实现差异的一个怪癖 - 无论如何,您只是因为不必要的新颖包名而遇到它。