termux-app

Форк
0
109 строк · 3.3 Кб
1
package com.termux.shared.jni.models;
2

3
import androidx.annotation.Keep;
4
import androidx.annotation.NonNull;
5

6
import com.termux.shared.logger.Logger;
7

8
/**
9
 * A class that can be used to return result for JNI calls with support for multiple fields to easily
10
 * return success and error states.
11
 *
12
 * https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
13
 * https://developer.android.com/training/articles/perf-jni
14
 */
15
@Keep
16
public class JniResult {
17

18
    /**
19
     * The return value for the JNI call.
20
     * This should be 0 for success.
21
     */
22
    public int retval;
23

24
    /**
25
     * The errno value for any failed native system or library calls if {@link #retval} does not equal 0.
26
     * This should be 0 if no errno was set.
27
     *
28
     * https://manpages.debian.org/testing/manpages-dev/errno.3.en.html
29
     */
30
    public int errno;
31

32
    /**
33
     * The error message for the failure if {@link #retval} does not equal 0.
34
     * The message will contain errno message returned by strerror() if errno was set.
35
     *
36
     * https://manpages.debian.org/testing/manpages-dev/strerror.3.en.html
37
     */
38
    public String errmsg;
39

40
    /**
41
     * Optional additional int data that needs to be returned by JNI call, like bytes read on success.
42
     */
43
    public int intData;
44

45
    /**
46
     * Create an new instance of {@link JniResult}.
47
     *
48
     * @param retval The {@link #retval} value.
49
     * @param errno The {@link #errno} value.
50
     * @param errmsg The {@link #errmsg} value.
51
     */
52
    public JniResult(int retval, int errno, String errmsg) {
53
        this.retval = retval;
54
        this.errno = errno;
55
        this.errmsg = errmsg;
56
    }
57

58
    /**
59
     * Create an new instance of {@link JniResult}.
60
     *
61
     * @param retval The {@link #retval} value.
62
     * @param errno The {@link #errno} value.
63
     * @param errmsg The {@link #errmsg} value.
64
     * @param intData The {@link #intData} value.
65
     */
66
    public JniResult(int retval, int errno, String errmsg, int intData) {
67
        this(retval, errno, errmsg);
68
        this.intData = intData;
69
    }
70

71
    /**
72
     * Create an new instance of {@link JniResult} from a {@link Throwable} with {@link #retval} -1.
73
     *
74
     * @param message The error message.
75
     * @param throwable The {@link Throwable} value.
76
     */
77
    public JniResult(String message, Throwable throwable) {
78
        this(-1, 0, Logger.getMessageAndStackTraceString(message, throwable));
79
    }
80

81
    /**
82
     * Get error {@link String} for {@link JniResult}.
83
     *
84
     * @param result The {@link JniResult} to get error from.
85
     * @return Returns the error {@link String}.
86
     */
87
    @NonNull
88
    public static String getErrorString(final JniResult result) {
89
        if (result == null) return "null";
90
        return result.getErrorString();
91
    }
92

93
    /** Get error {@link String} for {@link JniResult}. */
94
    @NonNull
95
    public String getErrorString() {
96
        StringBuilder logString = new StringBuilder();
97

98
        logString.append(Logger.getSingleLineLogStringEntry("Retval", retval, "-"));
99

100
        if (errno != 0)
101
            logString.append("\n").append(Logger.getSingleLineLogStringEntry("Errno", errno, "-"));
102

103
        if (errmsg != null && !errmsg.isEmpty())
104
            logString.append("\n").append(Logger.getMultiLineLogStringEntry("Errmsg", errmsg, "-"));
105

106
        return logString.toString();
107
    }
108

109
}
110

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.