JNI:jstring 使应用程序在 Android 上崩溃
我正在开始使用 Android-NDK。所以我们遇到了问题。 这是 C 文件:
#include <string.h>
#include <jni.h>
#include <stdio.h>
#define STRING "test"
jstring Java_com_gnufabio_ndk_test_testNDK_buildString(JNIEnv *env, jobject sThis){
jstring str_ret = (*env)->NewStringUTF(env, STRING);
return str_ret;
}
这里是 Java 文件:
package com.gnufabio.ndk.test;
import android.app.Activity;
import android.os.Bundle;
import android.text.style.BulletSpan;
import android.util.Log;
public class TestNDK extends Activity {
/** Called when the activity is first created. */
static {
System.loadLibrary("test");
}
public native String buildString();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start();
}
public void start (){
Log.d("NDK-TEST", "Started at: " + System.currentTimeMillis());
for (int i=0; i < 9999; i++){
buildString();
}
Log.d("NDK-TEST", "Finished at: " + System.currentTimeMillis());
}
}
问题是应用程序崩溃了。这里是日志猫:
I/DEBUG (86): pid: 1635, tid: 1637 >>> com.gnufabio.ndk.test <<< I/DEBUG ( 86):信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),故障地址 deadbaad I/DEBUG ( 86): r0 deadbaad r1 00000001 r2 a0000000 r3 00000000 I/调试(86):r4 00000000 r5 00000027 r6 0000f140 r7 40875418 I/调试(86):r8 100ffe5c r9 100ffe88 10 000b3f50 fp acaa149c I/调试(86):ip ffffffff sp 100ffde0 lr aff194ad pc aff15c1c cpsr 60000030 我/调试(86):d0 400000003eaaaaab d1 0000005f3f800000 我/调试(86):d2 4e194b6842be630c d3 42c8000000670ff0 我/调试(86):d4 000001fd00621bc8 d5 3fe999999999999a 我/调试(86):d6 3ff0000000000000 d7 3eaaaaab3f800000 我/调试(86):d8 0000000000000000 d9 0000000000000000 我/调试(86):d10 0000000000000000 d11 0000000000000000 我/调试(86):d12 0000000000000000 d13 0000000000000000 我/调试(86):d14 0000000000000000 d15 0000000000000000 我/调试(86):scr 80000012 我/调试(86): 我/调试(86):#00 pc 00015c1c /system/lib/libc.so I/DEBUG ( 86): #01 pc 00013efe /system/lib/libc.so (dlfree) I/DEBUG ( 86): #02 pc 0001445c /system/lib/libc.so (免费) I/DEBUG ( 86): #03 pc 0004cfc8 /system/lib/libdvm.so (dexDataMapFree) I/DEBUG ( 86): #04 pc 0004cff4 /system/lib/libdvm.so (dvmHeapGetNextObjectFromLargeTable) I/DEBUG ( 86): #05 pc 0001a070 /system/lib/libdvm.so (dvmGetNextHeapWorkerObject) 我/调试(86):#06 pc 0004d530 /system/lib/libdvm.so 我/调试(86):#07 pc 0004d682 /system/lib/libdvm.so 我/调试(86):#08 pc 0004be0e /system/lib/libdvm.so I/DEBUG ( 86): #09 pc 00011980 /system/lib/libc.so (__thread_entry) I/DEBUG ( 86): #10 pc 000114d4 /system/lib/libc.so (pthread_create) 我/调试(86): I/DEBUG (86): libc 基址: aff00000 我/调试(86): I/DEBUG ( 86):电脑周围的代码: 我/调试(86):aff15bfc 4623b15c 2c006824 e026d1fb b12368db 我/调试(86):aff15c0c 21014a17 6011447a 48124798 24002527 我/调试(86):aff15c1c f7f57005 2106eb8a ec18f7f6 460aa901 我/调试(86):aff15c2c f04f2006 94015380 94029303 efe2f7f5 我/调试(86):aff15c3c 4622a905 f7f52002 f7f5efec 2106eb76 我/调试(86): I/DEBUG ( 86):lr 周围的代码: 我/调试(86):aff1948c 41f0e92d 46804c0c 447c2600 68a56824 我/调试(86):aff1949c e0076867 300cf9b5 dd022b00 47c04628 我/调试(86):aff194ac 35544306 37fff117 6824d5f4 d1ee2c00 我/调试(86):aff194bc e8bd4630 bf0081f0 0002802e 41f0e92d 我/调试(86):aff194cc fb01b086 9004f602 461f4815 4615460c 我/调试(86): I/DEBUG(86):堆栈: 我/调试(86):100ffda0 00000000 我/调试(86):100ffda4 00000000 我/调试(86):100ffda8 00000000 我/调试(86):100ffdac 00000000 我/调试(86):100ffdb0 aff41700 我/调试(86):100ffdb4 aff41690 我/调试(86):100ffdb8 00000000 我/调试(86):100ffdbc aff194ad /system/lib/libc.so 我/调试(86):100ffdc0 00000000 I/调试(86):100ffdc4 100ffdf4 I/调试(86):100ffdc8 0000f140 我/调试(86):100ffdcc 40875418 I/调试(86):100ffdd0 100ffe5c 我/调试(86):100ffdd4 aff18619 /system/lib/libc.so 我/调试(86):100ffdd8 df002777 我/调试(86):100ffddc e3a070ad 我/调试(86):#00 100ffde0 aca9b64c 我/调试(86):100ffde4 aca57f6d /system/lib/libdvm.so 我/调试(86):100ffde8 00139958 我/调试(86):100ffdec 4087ca40 我/调试(86):100ffdf0 00139958 我/调试(86):100ffdf4 ffffbdf 我/调试(86):100ffdf8 100ffe5c 我/调试(86):100ffdfc 00000004 我/调试(86):100ffe00 00000018 我/调试(86):100ffe04 aff13f03 /system/lib/libc.so 我/调试(86):#01 100ffe08 00139958 我/调试(86):100ffe0c 4087ca40 我/调试(86):100ffe10 00000000 我/调试(86):100ffe14 402441e8 我/调试(86):100ffe18 100ffe5c 我/调试(86):100ffe1c aff1445f /system/lib/libc.so I/BootReceiver(164):将 /data/tombstones/tombstone_08 复制到 DropBox (SYSTEM_TOMBSTONE) D/Zygote (88):进程 1635 由信号终止 (11) I/ActivityManager(164):进程 com.gnufabio.ndk.test(pid 1635)已死亡。
有什么想法吗?看起来这是缓冲区溢出,但是是什么?提前致谢。
I'm getting started with Android-NDK. So here we are, with a problem.
This is the C file:
#include <string.h>
#include <jni.h>
#include <stdio.h>
#define STRING "test"
jstring Java_com_gnufabio_ndk_test_testNDK_buildString(JNIEnv *env, jobject sThis){
jstring str_ret = (*env)->NewStringUTF(env, STRING);
return str_ret;
}
And here the Java file:
package com.gnufabio.ndk.test;
import android.app.Activity;
import android.os.Bundle;
import android.text.style.BulletSpan;
import android.util.Log;
public class TestNDK extends Activity {
/** Called when the activity is first created. */
static {
System.loadLibrary("test");
}
public native String buildString();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start();
}
public void start (){
Log.d("NDK-TEST", "Started at: " + System.currentTimeMillis());
for (int i=0; i < 9999; i++){
buildString();
}
Log.d("NDK-TEST", "Finished at: " + System.currentTimeMillis());
}
}
The problem is that the app crashes. Here the logcat:
I/DEBUG ( 86): pid: 1635, tid: 1637 >>> com.gnufabio.ndk.test <<< I/DEBUG ( 86): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad I/DEBUG ( 86): r0 deadbaad r1 00000001 r2 a0000000 r3 00000000 I/DEBUG ( 86): r4 00000000 r5 00000027 r6 0000f140 r7 40875418 I/DEBUG ( 86): r8 100ffe5c r9 100ffe88 10 000b3f50 fp acaa149c I/DEBUG ( 86): ip ffffffff sp 100ffde0 lr aff194ad pc aff15c1c cpsr 60000030 I/DEBUG ( 86): d0 400000003eaaaaab d1 0000005f3f800000 I/DEBUG ( 86): d2 4e194b6842be630c d3 42c8000000670ff0 I/DEBUG ( 86): d4 000001fd00621bc8 d5 3fe999999999999a I/DEBUG ( 86): d6 3ff0000000000000 d7 3eaaaaab3f800000 I/DEBUG ( 86): d8 0000000000000000 d9 0000000000000000 I/DEBUG ( 86): d10 0000000000000000 d11 0000000000000000 I/DEBUG ( 86): d12 0000000000000000 d13 0000000000000000 I/DEBUG ( 86): d14 0000000000000000 d15 0000000000000000 I/DEBUG ( 86): scr 80000012 I/DEBUG ( 86): I/DEBUG ( 86): #00 pc 00015c1c /system/lib/libc.so I/DEBUG ( 86): #01 pc 00013efe /system/lib/libc.so (dlfree) I/DEBUG ( 86): #02 pc 0001445c /system/lib/libc.so (free) I/DEBUG ( 86): #03 pc 0004cfc8 /system/lib/libdvm.so (dexDataMapFree) I/DEBUG ( 86): #04 pc 0004cff4 /system/lib/libdvm.so (dvmHeapGetNextObjectFromLargeTable) I/DEBUG ( 86): #05 pc 0001a070 /system/lib/libdvm.so (dvmGetNextHeapWorkerObject) I/DEBUG ( 86): #06 pc 0004d530 /system/lib/libdvm.so I/DEBUG ( 86): #07 pc 0004d682 /system/lib/libdvm.so I/DEBUG ( 86): #08 pc 0004be0e /system/lib/libdvm.so I/DEBUG ( 86): #09 pc 00011980 /system/lib/libc.so (__thread_entry) I/DEBUG ( 86): #10 pc 000114d4 /system/lib/libc.so (pthread_create) I/DEBUG ( 86): I/DEBUG ( 86): libc base address: aff00000 I/DEBUG ( 86): I/DEBUG ( 86): code around pc: I/DEBUG ( 86): aff15bfc 4623b15c 2c006824 e026d1fb b12368db I/DEBUG ( 86): aff15c0c 21014a17 6011447a 48124798 24002527 I/DEBUG ( 86): aff15c1c f7f57005 2106eb8a ec18f7f6 460aa901 I/DEBUG ( 86): aff15c2c f04f2006 94015380 94029303 efe2f7f5 I/DEBUG ( 86): aff15c3c 4622a905 f7f52002 f7f5efec 2106eb76 I/DEBUG ( 86): I/DEBUG ( 86): code around lr: I/DEBUG ( 86): aff1948c 41f0e92d 46804c0c 447c2600 68a56824 I/DEBUG ( 86): aff1949c e0076867 300cf9b5 dd022b00 47c04628 I/DEBUG ( 86): aff194ac 35544306 37fff117 6824d5f4 d1ee2c00 I/DEBUG ( 86): aff194bc e8bd4630 bf0081f0 0002802e 41f0e92d I/DEBUG ( 86): aff194cc fb01b086 9004f602 461f4815 4615460c I/DEBUG ( 86): I/DEBUG ( 86): stack: I/DEBUG ( 86): 100ffda0 00000000 I/DEBUG ( 86): 100ffda4 00000000 I/DEBUG ( 86): 100ffda8 00000000 I/DEBUG ( 86): 100ffdac 00000000 I/DEBUG ( 86): 100ffdb0 aff41700 I/DEBUG ( 86): 100ffdb4 aff41690 I/DEBUG ( 86): 100ffdb8 00000000 I/DEBUG ( 86): 100ffdbc aff194ad /system/lib/libc.so I/DEBUG ( 86): 100ffdc0 00000000 I/DEBUG ( 86): 100ffdc4 100ffdf4 I/DEBUG ( 86): 100ffdc8 0000f140 I/DEBUG ( 86): 100ffdcc 40875418 I/DEBUG ( 86): 100ffdd0 100ffe5c I/DEBUG ( 86): 100ffdd4 aff18619 /system/lib/libc.so I/DEBUG ( 86): 100ffdd8 df002777 I/DEBUG ( 86): 100ffddc e3a070ad I/DEBUG ( 86): #00 100ffde0 aca9b64c I/DEBUG ( 86): 100ffde4 aca57f6d /system/lib/libdvm.so I/DEBUG ( 86): 100ffde8 00139958 I/DEBUG ( 86): 100ffdec 4087ca40 I/DEBUG ( 86): 100ffdf0 00139958 I/DEBUG ( 86): 100ffdf4 fffffbdf I/DEBUG ( 86): 100ffdf8 100ffe5c I/DEBUG ( 86): 100ffdfc 00000004 I/DEBUG ( 86): 100ffe00 00000018 I/DEBUG ( 86): 100ffe04 aff13f03 /system/lib/libc.so I/DEBUG ( 86): #01 100ffe08 00139958 I/DEBUG ( 86): 100ffe0c 4087ca40 I/DEBUG ( 86): 100ffe10 00000000 I/DEBUG ( 86): 100ffe14 402441e8 I/DEBUG ( 86): 100ffe18 100ffe5c I/DEBUG ( 86): 100ffe1c aff1445f /system/lib/libc.so I/BootReceiver( 164): Copying /data/tombstones/tombstone_08 to DropBox (SYSTEM_TOMBSTONE) D/Zygote ( 88): Process 1635 terminated by signal (11) I/ActivityManager( 164): Process com.gnufabio.ndk.test (pid 1635) has died.
Any idea? It seems that it's a buffer overflow, but of what? Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您必须将生成的 .h 文件包含在 .c 文件中,否则您的本机方法将没有正确的调用序列修饰符。
You must include the generated .h file in your .c file, otherwise your native method won't have the correct calling sequence modifiers.
这可能不会导致崩溃,但
Java_com_gnufabio_ndk_test_testNDK_buildString
行中的testNDK
应该是TestNDK
以匹配您的类名。This probably isn't causing the crash but
testNDK
should beTestNDK
in the lineJava_com_gnufabio_ndk_test_testNDK_buildString
to match your class name.您正在寻找的是:
What you are looking for is: