无法调用本机方法eclipse

3
我正在使用C++代码开发一个Android应用程序。尝试使用JNI,但是失败了。 这是我的代码: 来自jni文件夹中的test.c:
jstring Segment_com_example_segment_BrowsePicture_test( JNIEnv* env, jobject thiz )
{
    return (*env)->NewStringUTF(env, "test");
}

我已经通过ndk构建并生成了libtest.so库。 但是在我的BrowsePicture.java文件(位于Segment.com.example.segment下)中,我添加了


public native String  test();

但我打不通电话。消息是:

E/AndroidRuntime(16748): java.lang.UnsatisfiedLinkError: Native method not found: com.example.segment.BrowsePicture.test:()Ljava/lang/String;

那么,有人能告诉我出了什么问题吗?
3个回答

2

尝试通过更改方法名称来解决问题...

jstring Java_com_example_segment_BrowsePicture_test( JNIEnv* env, jobject thiz )

不要这样做...

jstring Segment_com_example_segment_BrowsePicture_test( JNIEnv* env, jobject thiz )

很好,正如我所说,你应该通过javah生成jni函数名称以避免错误。请参阅我的先前评论了解如何操作。 - Ziteng Chen

1

你是否声明了另一个类似于下面的类?

package com.yourpackage;
public class NativeLib {

static {
    System.loadLibrary("yourlibrary");
}

public static native void your_function(your_arguments);
}

然后通过以下方式从您的活动调用此函数

NativeLib.your_function(your_arguments);

是的,我添加了以下代码:static { System.loadLibrary("test"); }并在我的主活动中调用了它。我的 make 文件是:LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := test LOCAL_SRC_FILES := test.c include $(BUILD_SHARED_LIBRARY) - Le Duy Khanh
方法的名称正确吗?我只是按照 Hello-jini 的示例方式操作。 - Le Duy Khanh
创建另一个类,而不是在MainActivity中加载它。然后调用该方法。还要确保test.so受到正在运行的CPU架构的支持。否则,test.so将无法安装,您将看到此错误。 - Royston Pinto

0

你是通过以下方式加载库文件的吗:

...
public class BrowsePicture {

    static {
        // assume that libtestjni.so is your lib file
        System.loadLibrary("testjni");
    }
...

是的,我做了,我的 make 文件是:'LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := test LOCAL_SRC_FILES := test.cinclude $(BUILD_SHARED_LIBRARY)'然后我加载了静态库:'static { System.loadLibrary("test"); }' - Le Duy Khanh
你在 apk 中包含了 .so 文件吗?(将 .so 文件放入项目的 /libs/armeabi 文件夹中,ADT 将会将其打包到 apk 中)。 - Ziteng Chen
好的。我通常不手动编写jni函数,而是使用javah生成.h文件。首先构建Android项目(Java代码),然后启动命令行窗口并将目录更改为您的项目文件夹,然后运行“javah -classpath ./bin/classes -jni com.example.helloworld.MyJni”然后您会在项目文件夹中获得jni头文件(com_example_helloworld_MyJni.h)。您可以以同样的方式生成自己的.h文件,并包含该文件,而不是编写自己的函数声明。 - Ziteng Chen
好的,我会记下这个。非常感谢。我正在处理许多 .cpp 文件。 - Le Duy Khanh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接