首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android字符串返回为随机数

Android字符串返回为随机数
EN

Stack Overflow用户
提问于 2016-06-24 06:20:01
回答 2查看 527关注 0票数 0

我是JNI和Android的新手。我想从本机代码中返回一个字符串值,但它在执行时返回一些随机数。我无法理解我做错了什么。

我的"ndk.c“文件:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
 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正在返回随机数。

我的本机主函数正在返回int,并且正在工作,但是对于我的getMessage()函数,字符串不返回

我的getMessage()输出:

代码语言:javascript
运行
复制
Hi -429916127

我的Application.mk

代码语言:javascript
运行
复制
APP_ABI := armeabi-v7a
APP_PLATFORM := android-9

我的Android.mk

代码语言:javascript
运行
复制
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)

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-24 08:31:31

您有冲突的返回类型:

代码语言:javascript
运行
复制
jstring JNICALL Java_com_example_mayankvijh_test_1app_MainActivity_getMessage(JNIEnv *env, jobject thiz) {
  return (*env)->NewStringUTF(env,"HELLO");
  }

代码语言:javascript
运行
复制
public native int getMessage();

指针,它在作为整数处理的本机代码中返回。您应该将java中的去decaration修正为:

代码语言:javascript
运行
复制
public native String getMessage();
票数 0
EN

Stack Overflow用户

发布于 2016-06-24 06:54:29

Java端:

代码语言:javascript
运行
复制
  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

代码语言:javascript
运行
复制
#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 ".");
}

更新:

代码语言:javascript
运行
复制
jstring JNICALL Java_com_example_mayankvijh_test_1app_MainActivity_getMessage(JNIEnv *env, jobject thiz) {
return  (*env)->NewStringUTF(env,"HELLO");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38006777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档