java - Java 端未找到我的 native 方法

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

Java 端未找到我的 native 方法

我的 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: 线程退出并出现未捕获的异常 (group=0x41b73908)
10-17 16:00:52.456: E/AndroidRuntime(4699): 致命异常: main
10-17 16:00:52.456: E/AndroidRuntime(4699): java.lang.UnsatisfiedLinkError: 找不到 native 方法: com.dumb_dumber.myproject.SubActivity.nativeInitGPGS:(Lcom/dumb_dumber/myproject/SubActivity;)V
10-17 16:00:52.456:E/AndroidRuntime(4699):在 com.dumb_dumber.myproject.SubActivity.nativeInitGPGS( native 方法)
10-17 16:00:52.456: E/AndroidRuntime(4699): 在 com.dumb_dumber.myproject.SubActivity.onCreate(SubActivity)

我相信 native 实现可以放在任何地方并自动拾取。我已经尝试将 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(两次)并尝试在我的手机上运行。

我已经通过十六进制编辑器运行我的 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,在您标记了我的原始 Activity 类型名称/jobject 参数后,myproject 被忽略了。

最佳答案

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);

因此没有发现错误。

从您的 native 方法名称中删除多余的“1”。还要考虑选择一个更合理的包名称不带下划线

I've run my libmain.so through a hexeditor and can confirm it exists, with the _1 in place

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

关于java - Java 端未找到我的 native 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26428468/

相关文章:

java - 如何将Excel表格转换为Json

java - @MockBeans 有类似 Lombok @AllArgConstructor 的东西吗?

java - 如何在 Android 应用程序的语音识别中传递语言?

java - 如何分享我的 Android 代码?

java - 如何指定要使用的基于操作系统的 Java 库?

java - 注册网络应用程序后激活帐户

Android - 电子邮件 InputField 不接受用户输入

c++ - 要在我的 C++ 程序中使用 C 代码,我需要做什么特别的事情吗?

c++ - 尝试存储 map 插入的返回值时出错

c++ - 对 ofstream::open 的非阻塞调用?