Java 使用字符串参数调用JNI时崩溃

Java 使用字符串参数调用JNI时崩溃,java,android,android-ndk,java-native-interface,Java,Android,Android Ndk,Java Native Interface,我试图从我的Android代码中调用一个用C实现的函数。代码流程如下所示: 在我的主要活动的onCreate()中,我有: TestClass tc = new TestClass(); tc.act(); 这是TestClass: package bar.foo; public class TestClass { static { System.loadLibrary("testclass"); } public native voi

我试图从我的Android代码中调用一个用C实现的函数。代码流程如下所示:

在我的主要活动的onCreate()中,我有:

    TestClass tc = new TestClass();
    tc.act();
这是TestClass:

package bar.foo;

public class TestClass {
    static {
        System.loadLibrary("testclass");
    }
    public native void doStuff1(String s);
    public native void doStuff2(String s1, String s2);

    TestClass() { }
    public void act() {
        doStuff1 ("Foo");
        doStuff2 ("Bar", "Baz");
    }
}
testclass.c是:

#include <stdio.h>
#include <string.h>
#include <jni.h>
#include <android/log.h>

#define alprint __android_log_print

#define METHOD_SIGNATURE_1 Java_bar_foo_TestClass_doStuff1
#define METHOD_SIGNATURE_2 Java_bar_foo_TestClass_doStuff2

void METHOD_SIGNATURE_1(JNIEnv* env, jstring s) {

    const char *ns;
    int jsLen;

    /* Extract strings */
    ns = (*env)->GetStringUTFChars(env, s, NULL);
        jsLen = (*env)->GetStringUTFLength(env, s);

        alprint(6, "doStuff1", "Text = %s [%d]\n", ns, jsLen);

    (*env)->ReleaseStringUTFChars(env, s, ns);

        return;
}

void METHOD_SIGNATURE_2(JNIEnv* env, jstring s1, jstring s2) {

    const char *ns1;
    const char *ns2;
    int js1Len;
        int js2Len;

    /* Extract strings */
    ns1 = (*env)->GetStringUTFChars(env, s1, NULL);
        js1Len = (*env)->GetStringUTFLength(env, s1);
        ns2 = (*env)->GetStringUTFChars(env, s2, NULL);
        js2Len = (*env)->GetStringUTFLength(env, s2);

        alprint(6, "doStuff2", "Text(1) = %s [%d]\n", ns1, js1Len);
        alprint(6, "doStuff2", "Text(2) = %s [%d]\n", ns2, js2Len);

    (*env)->ReleaseStringUTFChars(env, s1, ns1);
    (*env)->ReleaseStringUTFChars(env, s2, ns2);

        return;
}
完整崩溃转储如下所示:


从昨天晚上起,我就为这件事伤了脑筋;有人知道这是怎么回事吗?

JNI函数中的第二个参数是对调用本机方法的Java对象(或者静态函数中的类)的引用。因此,您只需要在函数声明中添加一个
thiz
参数:

void METHOD_SIGNATURE_1(JNIEnv* env, jobject thiz, jstring s)
void METHOD_SIGNATURE_2(JNIEnv* env, jobject thiz, jstring s1, jstring s2)

嗯。谢谢这非常有效。也许我应该更注意文档。
void METHOD_SIGNATURE_1(JNIEnv* env, jobject thiz, jstring s)
void METHOD_SIGNATURE_2(JNIEnv* env, jobject thiz, jstring s1, jstring s2)