看起来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。
UPD1:看起来三星设备与android 4.1版本是风险组