2016-06-24 1 views
0

私はJNIとAndroidを初めて使用しています。ネイティブコードから文字列値を返したいが、実行時に乱数を返す。私は何が間違っているのか理解できません。Android JNI - 乱数として返される文字列

マイ "ndk.c" ファイル:

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

マイ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(); 

私は成功したライブラリー( ".soの")をロードしていると私はタイプJINTを返すことができていますアプリに表示されますが、何とかjstringが乱数を返しています。

Hi -429916127 

マイApplication.mk

:私のネイティブの主な機能がintを返していると作業が、私のgetMessage()関数文字列が

のgetMessage()のための私の出力を返すされていないためにされて

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

マイ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) 

ご協力いただきありがとうございます。

+0

使用' jオブジェクトthiz'は、私は両方を試してみました。このhttps://developer.android.com/ndk/samples/sample_hellojni.html – Madhur

+0

を参照してくださいcls' 、それはランダムな負の数を返しています。現在、 'Hi -253755359' –

+0

'JNIEXPORT'がこのキーワードを削除しました。 –

答えて

0
整数として扱わネイティブコードで返され

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

public native int getMessage(); 

ポインタ、:

あなたは競合戻り値の型を持っています。あなたはこのためにJavaでdecarationを修正する必要があります代わりに `JCLASSの

public native String getMessage(); 
+0

Omg、私は気づいたことがない、私はネイティブ側のメソッドを変更しましたが、Java側でそれを変更することを忘れました。愚かなルーキーの間違い。どうもありがとう –

0

のJavaサイド:

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

ネイティブ側:ファイル名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 "."); 
} 

更新:

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

は両方で試してみましたが、乱数を返しています。追加するだけで、私は 'JNIEXPORT'を使用してintを返すことができます –

+0

@MayankVijhはあなたのようにしようとしています –

+0

編集を確認してください。私はそれがあなたが言及したのと同じだと思う。私は 'wrapper.so'を作成して使用しています。 –

関連する問題