4
我想從我的Android代碼中調用C中實現的函數。該碼流是這樣的:當用String參數調用時JNI崩潰
在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;
}
這個編譯良好,並在我的Android設備(運行Android 5.1的Nexus 5)上啓動,但啓動時崩潰搭配:
JNI DETECTED ERROR IN APPLICATION: jstring has wrong type: bar.foo.TestClass
的完全崩潰轉儲是在這裏:http://pastebin.com/C0M98Uzb
我已經打破了我的頭在這一個,因爲昨天晚上;有人知道這是關於什麼嗎?
D-uh。謝謝。這工作完美。我應該更多地關注文檔。 – ObiObi 2015-04-03 11:26:35