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/