termux-app
109 строк · 3.3 Кб
1package com.termux.shared.jni.models;
2
3import androidx.annotation.Keep;
4import androidx.annotation.NonNull;
5
6import 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
16public class JniResult {
17
18/**
19* The return value for the JNI call.
20* This should be 0 for success.
21*/
22public 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*/
30public 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*/
38public String errmsg;
39
40/**
41* Optional additional int data that needs to be returned by JNI call, like bytes read on success.
42*/
43public 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*/
52public JniResult(int retval, int errno, String errmsg) {
53this.retval = retval;
54this.errno = errno;
55this.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*/
66public JniResult(int retval, int errno, String errmsg, int intData) {
67this(retval, errno, errmsg);
68this.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*/
77public JniResult(String message, Throwable throwable) {
78this(-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
88public static String getErrorString(final JniResult result) {
89if (result == null) return "null";
90return result.getErrorString();
91}
92
93/** Get error {@link String} for {@link JniResult}. */
94@NonNull
95public String getErrorString() {
96StringBuilder logString = new StringBuilder();
97
98logString.append(Logger.getSingleLineLogStringEntry("Retval", retval, "-"));
99
100if (errno != 0)
101logString.append("\n").append(Logger.getSingleLineLogStringEntry("Errno", errno, "-"));
102
103if (errmsg != null && !errmsg.isEmpty())
104logString.append("\n").append(Logger.getMultiLineLogStringEntry("Errmsg", errmsg, "-"));
105
106return logString.toString();
107}
108
109}
110