2016-06-24 10 views
0

Ich bin neu in JNI und Android. Ich möchte einen String-Wert aus dem nativen Code zurückgeben, aber bei der Ausführung gibt er eine Zufallszahl zurück. Ich kann nicht verstehen, was ich falsch mache.Android JNI - String Return als Zufallszahl

Meine "ndk.c" file:

int Java_com_example_mayankvijh_test_1app_MainActivity_main(){ 
return 3; 
} 

jstring JNICALL Java_com_example_mayankvijh_test_1app_MainActivity_getMessage(JNIEnv *env, jobject thiz) { 
    return (*env)->NewStringUTF(env,"HELLO"); 
    } 

Mein MainActivity.java

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    try{ 
     System.loadLibrary("wrapper"); 

    }catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

    System.out.println("main return =" + main()); 
    System.out.println("Hi " + getMessage()); 
} 

public native int main(); 
public native int getMessage(); 

ich die Bibliothek geladen haben (".so") erfolgreich und ich bin in der Lage Art JINT zurückzukehren und Anzeige in der App, aber irgendwie jstring gibt Zufallszahlen zurück.

Meine Mutterhauptfunktion int zurückkehrt und funktioniert, aber für meine getMessage() function string ist nicht

Rückkehr

Mein Ausgang für getMessage():

Hi -429916127 

Mein Application.mk

APP_ABI := armeabi-v7a 
APP_PLATFORM := android-9 

Mein Android.mk

LOCAL_PATH:=$(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := wrapper 

LOCAL_C_INCLUDES := $(LOCAL_PATH) 

LOCAL_SRC_FILES := ndk.c 

LOCAL_LDLIBS := -landroid 
#--llog -lz 

include $(BUILD_SHARED_LIBRARY) 

Danke für Ihre Hilfe.

+0

Verwendung 'jobject thiz' statt' JClass dieses https://developer.android.com/ndk/samples/sample_hellojni.html bezieht cls' – Madhur

+0

ich mit beiden versucht Es gibt eine zufällige negative Zahl zurück. Zur Zeit wurde 'Hi -253755359' –

+0

'JNIEXPORT' zurückgegeben, um dieses Schlüsselwort zu entfernen. –

Antwort

0

Sie haben widersprüchliche Rückgabetypen:

jstring JNICALL Java_com_example_mayankvijh_test_1app_MainActivity_getMessage(JNIEnv *env, jobject thiz) { 
    return (*env)->NewStringUTF(env,"HELLO"); 
    } 

und

public native int getMessage(); 

Pointer, dass in nativen Code als ganze Zahl behandelt wird zurückgegeben. Sie sollten decaration in Java zu diesem Problem zu beheben:

public native String getMessage(); 
+0

Omg, habe ich nie bemerkt, dass ich eine Methode auf der nativen Seite geändert habe, aber vergessen, es auf Java-Seite zu ändern. Blöder Anfängerfehler. Danke vielmals –

0

Java Side:

public class HelloJni extends Activity{ 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    TextView tv = new TextView(this); 
    tv.setText(stringFromJNI()); 
    setContentView(tv); 
} 

public native String stringFromJNI(); 
public native String unimplementedStringFromJNI(); 
static { 
    System.loadLibrary("hello-jni"); 
    } 
} 

Mutter Seite: Dateiname hello-jni.c

#include <string.h> 
#include <jni.h> 

/* This is a trivial JNI example where we use a native method 
* to return a new VM String. See the corresponding Java source 
* file located at: 
* 
* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java 
*/ 
jstring 
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, 
                jobject thiz) 
{ 
#if defined(__arm__) 
    #if defined(__ARM_ARCH_7A__) 
    #if defined(__ARM_NEON__) 
     #if defined(__ARM_PCS_VFP) 
     #define ABI "armeabi-v7a/NEON (hard-float)" 
     #else 
     #define ABI "armeabi-v7a/NEON" 
     #endif 
    #else 
     #if defined(__ARM_PCS_VFP) 
     #define ABI "armeabi-v7a (hard-float)" 
     #else 
     #define ABI "armeabi-v7a" 
     #endif 
    #endif 
    #else 
    #define ABI "armeabi" 
    #endif 
#elif defined(__i386__) 
    #define ABI "x86" 
#elif defined(__x86_64__) 
    #define ABI "x86_64" 
#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ 
    #define ABI "mips64" 
#elif defined(__mips__) 
    #define ABI "mips" 
#elif defined(__aarch64__) 
    #define ABI "arm64-v8a" 
#else 
    #define ABI "unknown" 
#endif 

    return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI "."); 
} 

Update:

jstring JNICALL Java_com_example_mayankvijh_test_1app_MainActivity_getMessage(JNIEnv *env, jobject thiz) { 
return (*env)->NewStringUTF(env,"HELLO"); 
} 
+0

versucht mit beiden, es gibt eine Zufallszahl zurück. Nur um hinzuzufügen, kann ich Int mit und ohne Verwendung von 'JNIEXPORT' zurückgeben –

+0

@MayankVijh versuchen Sie wie oben –

+0

Bitte überprüfen Sie die Bearbeitung. Ich denke, es ist dasselbe wie du erwähnt hast. Ich erstelle eine "wrapper.so" und benutze sie. –