Android中本机库中的奇怪错误

时间:2014-07-31 16:42:23

标签: android android-ndk

看起来Android上的执行发布本机代码存在错误< 4.3。

如何重现:在Android NDK samples/hello-jni中取样并将hello-jni.c中的代码替换为以下内容:

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

static double g_now;

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    struct timespec ts;
    ts.tv_sec = (unsigned int)3;
    ts.tv_nsec = 0;
    nanosleep(&ts, NULL);

    double now = 12839123.0;
    g_now = now;

    while (1) {
        struct timespec ts;
        ts.tv_sec = (unsigned int)0;
        ts.tv_nsec = 20000000;
        nanosleep(&ts, NULL);

        if (now != g_now)
            return (*env)->NewStringUTF(env, "Shit happened");
    }
return (*env)->NewStringUTF(env, "Hello from JNI");

}

然后在debug

中测试它
cd jni
ndk-build NDK_DEBUG=1
cd ../
ant debug && adb install -r bin/HelloJni-debug.apk

并在发布中

cd jni
ndk-build NDK_DEBUG=0
cd ../
ant debug && adb install -r bin/HelloJni-debug.apk

我在Nexus 5(Android 4.4.4)上进行了测试 - 发布和调试只是在运行无限循环时显示黑屏。

但是在三星SII(Android 4.1.2)发布时突然显示出“狗屎发生”的字符串。这意味着变量没有被修改就改变了。这反过来意味着CPU 上的一些寄存器被覆盖

是否有任何解决方法或这是已知错误?

我正在运行的配置:SDK 23.0.2(构建工具20)和ndk-r10-64,Mac OS 10.9.4。

Example (release one)

UPD1:看起来三星设备与android 4.1版本是风险组

0 个答案:

没有答案