gpt4 book ai didi

java - 使用 String 参数调用时 JNI 崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:31 25 4
gpt4 key购买 nike

我正在尝试从我的 Android 代码中调用一个用 C 语言实现的函数。代码流程是这样的:

在我的主要 Activity 的 onCreate() 中,我有这个:

    TestClass tc = new TestClass();
tc.act();

这是测试类:

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

编译正常,并在我的 Android 设备(运行 Android 5.1 的 Nexus 5)上启动,但在启动时崩溃:

JNI DETECTED ERROR IN APPLICATION: jstring has wrong type: bar.foo.TestClass

完整的崩溃转储在这里:http://pastebin.com/C0M98Uzb

从昨天晚上开始,我就一直在为这个问题绞尽脑汁;有谁知道这是关于什么的?

最佳答案

JNI 函数中的第二个参数是对调用 native 方法的 Java 对象的引用(如果是静态函数,则为类)。所以你只需要在你的函数声明中添加一个 thiz 参数:

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

关于java - 使用 String 参数调用时 JNI 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29428181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com