小编Bib*_*ibu的帖子

如何在Android NDK上使用JNI在C和Java之间传递复杂结构

我在Android应用程序的C代码中有一个复杂的结构,我想在Java端使用它.我已经用google和stackoverflow做了一些研究,所以我从我的C结构创建了java类,但现在如何用Java创建它.

我已经找到了这些信息,关于在类中创建一个指针并在C端使用它:

Get the field ID : (*env)->GetFieldID(...)
Get the pointer : (*env)->GetLongField(...)
Set the pointer : (*env)->SetLongField(...)
Run Code Online (Sandbox Code Playgroud)

但我不明白它是如何运作的......

在上面,你可以找到我到目前为止所做的事情......不是那么多!在C方面:

ComplexStructure Java_com_main_MainActivity_listenUDP(JNIEnv* env, jclass clazz)
{
    int i,taille;
    ComplexStructure myStruct;    
    taille = -1;    
    taille = recvfrom(socket, &myStruct, sizeof(ComplexStructure ), 0, &rcvAddr, &sizeOfSock);
    if(taille != -1)
    {   
        return myStruct;
    }
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

而在Java方面:

public void getFromUDP() {

    ComplexClass myClass = new ComplexClass();
    myClass = listenUDP();              
}

@Override
public void run() {
    initUDP();
    getFromUDP();
}


public static native ComplexClass listenUDP();
public …
Run Code Online (Sandbox Code Playgroud)

c java java-native-interface share android-ndk

10
推荐指数
1
解决办法
2万
查看次数

使用Android的Raspberry Pi 3屏幕方向

我刚买了一台带有7英寸显示屏触摸屏和外壳的Raspberry Pi 3.

不幸的是,外壳不允许我手动旋转屏幕,所以我的应用程序颠倒了.

我尝试使用以下adb命令从控制台执行此操作,但没有运气:

adb shell content insert --uri content://settings/system --bind name:s:accelerometer_rotation --bind value:i:0
Run Code Online (Sandbox Code Playgroud)

然后

adb shell content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:1
Run Code Online (Sandbox Code Playgroud)

要么

adb shell content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:3
Run Code Online (Sandbox Code Playgroud)

有没有办法从配置标志直接执行它,从启动处理屏幕方向?

android raspberry-pi raspberry-pi3 android-things

10
推荐指数
1
解决办法
4637
查看次数

如何限制广播到自己的Android应用程序

我想知道是否有可能创建一个私人广播.我实际上在我的活动和使用中注册了broadcastreceiver

sendOrderedBroadcast(broadcast);
Run Code Online (Sandbox Code Playgroud)

发送广播的方法.但是,目前,用于此方法的intent(广播)定义如下:

Intent broadcast = new Intent("com.mypackage.broadcast");
Run Code Online (Sandbox Code Playgroud)

因此,声明此包名称的每个外部应用程序都可以监听我发送的内容,而我不想这样做.

那么如何让这个变得不可能,没人能听我的广播?

android broadcastreceiver

7
推荐指数
1
解决办法
1892
查看次数

如何将GeoPoint转换为硬件屏幕点

我想将GeoPoint转换为屏幕点,以便识别触摸事件之上的所有对象.所以,我试过这个:

Projection projection = this.mapView.getProjection(); 
GeoPoint gie = new GeoPoint(lat, lon);
Point po = new Point();
projection.toPixels(gie, po);
Run Code Online (Sandbox Code Playgroud)

但是,po.x和po.y不是屏幕坐标,而是mapview coords在像素而不是lat,lon.

来自android开发者网站:

toPixels(GeoPoint in,android.graphics.Point out)将给定的GeoPoint转换为相对于提供此Projection的MapView左上角的屏幕像素坐标.

那么,是否可以在正确的屏幕上转换它?

我想知道+ touch事件旁边的所有x GeoPoint,如上例所示:

----------------------------------------------------------------
(0,0) -----------> x                                           |
  |                                                            |
  |                                                            | 
  |                                                            |  <-- My screen
  |                              + (touch event)               |
 \/                            x (my GeoPoint)                 |
  y                                                            |
                                                               | 
---------------------------------------------------------------- 
Run Code Online (Sandbox Code Playgroud)

我得到了这样的触摸事件:

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
Run Code Online (Sandbox Code Playgroud)

在这里,在这段代码中,x和y是真正的屏幕坐标(硬件坐标,而不是mapview)

我知道我也可以在GeoPoint中转换x,y屏幕坐标,将它们与我的GeoPoint进行比较,但是,由于缩放级别,我无法得到我想要的.

android android-mapview

6
推荐指数
1
解决办法
3013
查看次数

Android GCM未经授权401错误与PHP

最近我的GCM推送消息通知不再起作用.我没有更改任何内容,在我的Google API控制台中,如果是白名单IP地址,我已经注册了我的专用服务器的IPV6.

但是当我尝试访问GCM服务时,我总是收到错误:

擅自

错误401

也试过IPV4但没有成功......

我在自己的电脑上尝试过相同的脚本,一切顺利......

任何想法都会非常感激:)

谢谢你的帮助

android google-cloud-messaging

5
推荐指数
1
解决办法
1万
查看次数

将固定大小的 Map 序列化为 CBOR

我有以下 JSON:

[
  {
    2: {
      "c": true
    }
  },
  {
    3: {
      "p": 10
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

我想转换为 CBOR 格式。根据 cbor.me 我有以下输出:

82A102A16163F5A103A161700A

但是,当使用 Jackson Binary CBOR Serializer 时,我有以下输出:

82BF02BF6163F5FFFFBF03BF61700AFFFF

这并没有错,但没有优化......我有额外的 4 个不必要的字节添加到它真正可能的位置。

然后我尝试手动序列化 JSON 但结果相同:

@Override
public void serialize(Request value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException, JsonProcessingException {
    jgen.writeStartArray(value.getDataList().size());
    for (Data data : value.getDataList()) {
        jgen.writeStartObject(new Map[1]);
        jgen.writeFieldId(data.getItem());
        jgen.writeStartObject();
        if (data.getObject().getC() != null) {
            jgen.writeBooleanField("c", data.getObject().getC());
        }
        if (data.getObject().getP() != null) {
            jgen.writeNumberField("p", data.getObject().getP());
        }
        jgen.writeEndObject();
        jgen.writeEndObject();
    } …
Run Code Online (Sandbox Code Playgroud)

java serialization json jackson cbor

5
推荐指数
1
解决办法
1083
查看次数

如何使用Java在点周围旋转多边形?

我正在创建一个Canvas对象(直线,顶点,三角形......),我想在它们周围应用一个旋转.

我不能使用Canvas的rotate()方法,因为点附加到Map上的GeoPoint,所以如果我使用rotate()方法,则所有地图都在旋转......

问题是Canvas需要Point(int,int)并且应用旋转会因cos和sin函数而创建double.因此,当我将旋转应用于所有点时,由于将double转换为int,我发生了一些图形问题...

所以我正在寻找最好的解决方案.

这是我的轮换代码:

public Point rotatePoint(Point pt, Point center)
{
    this.angle = ((this.angle/180)*Math.PI);
    double cosAngle = Math.cos(this.angle);
    double sinAngle = Math.sin(this.angle);

    pt.x = center.x + (int) ((pt.x-center.x)*cosAngle-(pt.y-center.y)*sinAngle);
    pt.y = center.y + (int) ((pt.x-center.x)*sinAngle+(pt.y-center.y)*cosAngle);
    return pt;
}
Run Code Online (Sandbox Code Playgroud)

java casting rotation

3
推荐指数
1
解决办法
7799
查看次数

Android-圆角正方形线进度栏

我正在尝试创建一个圆角的正方形线进度条,以围绕图像绘制进度。

在此处输入图片说明

到目前为止,我有以下XML定义了我的圆角正方形线:

<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <stroke
        android:width="6dp"
        android:color="@android:color/holo_green_light" />

    <padding
        android:left="5dp"
        android:right="5dp"
        android:bottom="5dp"
        android:top="5dp" />

    <corners android:radius="50dp" />

</shape>
Run Code Online (Sandbox Code Playgroud)

我知道这种解决方案:https : //github.com/mrwonderman/android-square-progressbar,但我对此并不感兴趣,因为效果不是我想要的。

我尝试在圆角正方形线的顶部创建一个普通圆,并尝试将其与PorterDuff合并,但是到目前为止,我也无法创建进度条效果。画一个圆圈,画出进度。

我还尝试过创建圆角正方形程序,以防XML膨胀被视为纯图像并且在PorterDuff合并过程中考虑了所有像素。但结果相同。

android line rounded-corners android-progressbar

3
推荐指数
1
解决办法
1001
查看次数

在OkHttp库中使用Interceptor

我需要使用所有请求参数生成签名验证:

  • 询问
  • 方法
  • 身体
  • 安全令牌

所以,我写了一个小的SignatureInterceptor类:

public class SignatureInterceptor implements Interceptor {

    private String token;
    private String signature = "";
    private String method;
    private String query;

    public SignatureInterceptor() {
            this.token = "456456456456";
    }

    @Override
    public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
        Request originalRequest = chain.request();
        if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) {
            return chain.proceed(originalRequest);
        }

        method = originalRequest.method();
        query = originalRequest.urlString();

        Request authenticatedRequest = originalRequest.newBuilder()
                .method(originalRequest.method(), authenticate(originalRequest.body()))
                .addHeader("signature", signature)
                .build();
        return chain.proceed(authenticatedRequest);
    }

    private RequestBody authenticate(final RequestBody body) …
Run Code Online (Sandbox Code Playgroud)

java interceptor retrofit okhttp

2
推荐指数
1
解决办法
2989
查看次数