2015-04-03 2 views
4

Я пытаюсь вызвать функцию, реализованную в C из моего кода на Android. Поток кода заключается в следующем:JNI сбой при вызове с аргументом String

В 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 (Nexus 5 под управлением Android 5.1), но сбой при запуске с:

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

Полный дампе находится здесь: http://pastebin.com/C0M98Uzb

Я был ломать голову над этим один со вчерашнего вечера; кто-нибудь знает, что это значит?

ответ

14

Второй параметр в функции JNI - это ссылка на объект Java, на который был вызван метод native (или класс в случае статической функции). Поэтому вам просто нужно добавить параметр 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

Смежные вопросы