有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java-SIGSEGV-Android-JNI-empty方法

我遇到了非常奇怪的问题,我不知道出了什么问题,因为我已经注释掉了所有内容,但它仍然崩溃

这是我的密码

Java部分

package net.example.library.arrayprocessor;


public class ArrayProcessor {
    static {
        System.loadLibrary("array-processor");
    }

    public ArrayProcessor() {

    }

    public native short[] process(short[] readBuffer);

}

我这样称呼它

   buffer = arrayProcessor.process(buffer);

JNI部分 CMAke

# Cmake Minimum Version
cmake_minimum_required(VERSION 3.4.1)

add_library(array-processor SHARED
            processor.cpp)
# Link
target_link_libraries(
            array-processor
            安卓
            log)

处理器。cpp

#include <jni.h>
#include <stdio.h>

#define LOGI(...) \
  ((void)__安卓_log_print(ANDROID_LOG_INFO, "VoiceProcessor::", __VA_ARGS__))

extern "C" {
JNIEXPORT jshortArray JNICALL
Java_net_example_library_arrayprocessor_ArrayProcessor_processor(
        JNIEnv *env, jobject instance, jshortArray readBuffer_);
}

JNIEXPORT jshortArray JNICALL
Java_net_example_library_arrayprocessor_ArrayProcessor_processor(
        JNIEnv *env, jobject instance, jshortArray readBuffer_) {

  /* get size of the array */
  jsize len = env->GetArrayLength(readBuffer_);

  /* get the body of array; it will be referecende by C pointer */
  jshort *body = env->GetShortArrayElements(readBuffer_, 0);

  /* do some stuff */
  for (int i = 0; i < len; i++) {
    printf("Short value: %hd\n", body[i]);

    /* update value */
    body[i] = 0;
  }

  /* release body when you decide it is no longer needed
    Pass changes back to Java */
  env->ReleaseShortArrayElements(readBuffer_, body, JNI_COMMIT);
}

但当我试图调用它时,它会抛出一个错误

 A/libc: Fatal signal 11 (SIGSEGV) at 0xc0c5a8f7 (code=1), thread 19335 (pool-3-thread-1)

我试图注释掉方法的主体,但仍然是相同的错误

   A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x6 in tid 3749 (pool-4-thread-1)

我的代码可能有什么问题?如何解决和调试这些问题

如果有任何帮助,我将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    您没有返回值。您可以返回readBuffer_,但如果该方法只需要修改输入数组,则根本不需要返回值。它可以声明为void

    C编译器至少应该警告过你这一点。不要忽视警告,也不要关闭它们。JNI代码必须非常干净