JNI:jstring 使应用程序在 Android 上崩溃

发布于 2024-12-09 16:12:52 字数 4675 浏览 0 评论 0原文

我正在开始使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

古镇旧梦 2024-12-16 16:12:52

您必须将生成的 .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.

〃安静 2024-12-16 16:12:52

这可能不会导致崩溃,但 Java_com_gnufabio_ndk_test_testNDK_buildString 行中的 testNDK 应该是 TestNDK 以匹配您的类名。

This probably isn't causing the crash but testNDK should be TestNDK in the line Java_com_gnufabio_ndk_test_testNDK_buildString to match your class name.

呆° 2024-12-16 16:12:52

您正在寻找的是:

jstring str_ret = env->NewStringUTF(STRING);

What you are looking for is:

jstring str_ret = env->NewStringUTF(STRING);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文