2015-04-03 61 views
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

我已經打破了我的頭在這一個,因爲昨天晚上;有人知道這是關於什麼嗎?

回答

14

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) 
+0

D-uh。謝謝。這工作完美。我應該更多地關注文檔。 – ObiObi 2015-04-03 11:26:35