小编Ale*_*ohn的帖子

编译依赖于使用Android NDK运行的其他本机库的本机库?

我有一个很大的C文件库,它依赖于OpenSSL,我对使用本机库非常陌生,尤其是使用android的新手.我已经成功地在iOS上实现了这个库而没有任何问题.

我一直在网上寻找有关如何做到这一点的教程/信息,但到目前为止我还没有发现任何我能理解的内容.这对我来说都很困惑.

本质上我正在试图弄清楚如何使用NDK将C文件库编译成本机库,并使用imy android应用程序编译库.

根据我的理解,我需要一个自定义的cmake文件用于android本身,但我不知道从哪里开始,我发现的文档非常难以理解.

所以,我需要一些帮助来理解在以下庄园中编译库的过程:

  1. 编译库,使用Gradle和CMakeLists.txt将其与openssl和libcrypto链接,并将最终库与我的Android Studio项目链接.
  2. 能够从我的Java代码中调用这些库中的本机函数.(我知道这需要一个JNI Java Wrapper)

(我已经设法为android需要的所有arch构建libssl和libcrypto,但我不知道如何处理.a/ .sofiles.)

任何有关此事的帮助都会令人难以置信.

谢谢

编辑:

我设法使用以下内容生成一些库文件.

文件结构:

.idea
app
build
gradle
jni    <--- I made this folder specifically fo this.
    Android.mk <-- This is the important file.
    include
        openssl
            <openssl header files>
    libs
        arm64-v8a
            libcrypto.a
            libcrypto.so
            libssl.a
            libssl.so
        armeabi
            libcrypto.a
            libcrypto.so
            libssl.a
            libssl.so
        armeabi--v7a
            libcrypto.a
            libcrypto.so
            libssl.a
            libssl.so
        mips
            libcrypto.a
            libcrypto.so
            libssl.a
            libssl.so
        mips64
            libcrypto.a
            libcrypto.so
            libssl.a
            libssl.so
        x86
            libcrypto.a
            libcrypto.so
            libssl.a
            libssl.so
        x86_64
            libcrypto.a
            libcrypto.so …
Run Code Online (Sandbox Code Playgroud)

openssl android-ndk android-gradle-plugin

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

java.lang.OutOfMemoryError:无法分配JNI Env

当我第一次运行异步任务时,它可以正常工作。实际上,此错误是无法预料的。我在这个问题上搜索了很多解决方案,但对我来说没有任何用处。我得到的常见解决方案是,我们需要关闭InputStream / ByteArrayInputStream,我关闭了所有程序,但仍然崩溃。

堆栈跟踪:

java.lang.OutOfMemoryError:无法在java.lang.Thread.start(Thread.java:730)处java.lang.Thread.nativeCreate(Native Method)处分配JNI Env在java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor .java:941),位于java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:1009),位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1151),位于java.util.concurrent.ThreadPoolExecutor $ Worker。在java.lang.Thread.run(Thread.java:761)上运行(ThreadPoolExecutor.java:607)

以下是AsyncTask;

public class AsyncHttpRequest extends AsyncTask<Void, Void, String> {

    private String UrlString = "";
    private boolean _showProgressDialog = false;
    private CustomCircularLoadingDialog Dialog;
    private Context mContext;
    AppCompatActivity mActivity;
    private IHttpRequestCompletedListener listener;
    private boolean isActivity = true;
    private String _messageText = "Please wait..."; 
    private String type = "get";

    private HttpUtility utility;


    public AsyncHttpRequest(String urlString, Context context, IHttpRequestCompletedListener listener, boolean _showProgressDialog) {
        UrlString = urlString;
        this._showProgressDialog = _showProgressDialog;
        this.mContext = context;
        this.listener = …
Run Code Online (Sandbox Code Playgroud)

android out-of-memory httpurlconnection android-asynctask

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

组织回调的首选方式是什么?

在我的Android项目中,我定义了一些回调来对按钮单击,连接事件或UI事件(例如Dilaog.onShow())进行操作。出于演示目的,我选择了必须从一些Activity代码启动的Runnable接口。使用Java,我有不同的表达方式。

一种模式是使用匿名类

runOnUiThread(new Runnable() { 
    public void run() { 
        doSomething(); 
    }
});

private void doSomething() {
}
Run Code Online (Sandbox Code Playgroud)

另一个-定义内部私有类,即

private DoSomething implements Runnable {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(new DoSomething());
Run Code Online (Sandbox Code Playgroud)

还有一个-使用私有成员,例如:

private final Runnable doSomething = new Runnable() {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(doSomething);
Run Code Online (Sandbox Code Playgroud)

这是我最喜欢的另一个,因为一方面,除非有人真正使用它,否则它实际上不会构造对象;因为它避免了多余的类,因为它可以在需要时使用参数。

private Runnable doSomething() { 
    return new Runnable() {
        public void run() { 
            // do something; 
        }
    }
}
...
runOnUiThread(doSomething());
Run Code Online (Sandbox Code Playgroud)

我不是在寻找关于品味或宗教信仰的争论,而是在寻找代码的可维护性和性能。我想收到一些提示和建议,这些建议可以帮助我发展自己的偏爱,可能-根据给定的情况选择不同的偏爱。

扰流板:

Java的进步使这个问题过时了,​​请参见已接受的答案。

java lambda coding-style anonymous-class private-class

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

外部硬件信息

是否有可能检查计算机中连接的外部硬件是什么

获取每个硬件的状态是在线还是离线

java android android-ndk usb-otg

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

Android startCamera为我提供了空Intent,并且...是否破坏了我的全局变量?

我有下一个问题:

当我尝试启动相机时,我可以拍摄照片,甚至将其保存在sdcard上,但是当我准备在设备上显示该照片的路径时,会出现错误。

我的全局变量为2(我使用了1,但最好使用2来确保这是一个奇怪的错误):

    private File photofile;
private Uri mMakePhotoUri;
Run Code Online (Sandbox Code Playgroud)

这是我的入门相机功能:

@SuppressLint("SimpleDateFormat")
public void farefoto(int num){
// For naming the picture
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
    String n = sdf.format(new Date());
    String fotoname = "Immagine-"+ n +".jpg";

//Going through files and  folders
    File photostorage = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File photostorage2 = new File(photostorage, "Immagini");
    System.out.println(photostorage+"\n"+photostorage2);
    photostorage2.mkdirs();
// My file (global)
    photofile = new File(photostorage2, fotoname);
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //intent to start camera
// My URI (global)
    mMakePhotoUri = Uri.fromFile(photofile);
    new Bundle(); …
Run Code Online (Sandbox Code Playgroud)

variables android global nullpointerexception android-camera-intent

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

如何手动将 Android SIGSEGV 地址映射到链接器映射文件?

我的 Java 应用程序有一个 JNI 层,用于与本机 C++ 库通信。当应用程序空闲大约三 (3) 分钟时,应用程序崩溃,LogCat 显示以下堆栈跟踪:

07-13 13:21:35.876: A/libc(9889): Fatal signal 11 (SIGSEGV) at 0x606b0ba4 (code=1), thread 9889 (nc.myapp)
07-13 13:21:35.980: I/DEBUG(4710): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-13 13:21:35.980: I/DEBUG(4710): Build fingerprint: 'motorola/ghost_retail/ghost:4.4.3/KXA21.12-L1.21/23:user/release-keys'
07-13 13:21:35.981: I/DEBUG(4710): Revision: 'p300'
07-13 13:21:35.983: I/DEBUG(4710): pid: 9889, tid: 9889, name: nc.myapp  >>> com.company.myapp <<<
07-13 13:21:35.984: I/DEBUG(4710): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 606b0ba4
07-13 13:21:36.093: I/DEBUG(4710): …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface android android-ndk addr2line

5
推荐指数
0
解决办法
738
查看次数

在Android中裁剪图像(裁剪意图)

我用这个代码来使用android的内置图像裁剪工具.我的代码如下

 public void takePicture(){
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null){
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString());
        takePictureIntent.putExtra("crop", "true");
        takePictureIntent.putExtra("aspectX", 0);
        takePictureIntent.putExtra("aspectY", 0);
        takePictureIntent.putExtra("outputX", 200);
        takePictureIntent.putExtra("outputY", 150);
        takePictureIntent.putExtra("return-data", true);

        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }

}

protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        imageViewImage.setImageBitmap(imageBitmap);

    }
}
Run Code Online (Sandbox Code Playgroud)

在Button的单击侦听器内调用takePicture.做的是我可以打开Android相机拍照,当点击保存图像保存在我的imageView上.但是没有出现裁剪活动,而且imageView上的图像看起来很糟糕.质量就像它的像素化.难道我做错了什么?我使用三星galaxy tab 3来测试我的应用程序

使用以下答案编辑... Stil无法正常工作

 protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if (requestCode == REQUEST_IMAGE_CAPTURE && …
Run Code Online (Sandbox Code Playgroud)

android image crop android-crop

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

使用意图 ACTION_IMAGE_CAPTURE 时如何将方向锁定为纵向?

我知道我可以在清单中设置活动的方向,但是当此活动调用MediaStore.ACTION_IMAGE_CAPTURE打开相机并拍照时,用户仍然可以以横向模式拍照。我可以将相机应用程序本身的方向锁定为纵向吗?

这是示例代码:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
startActivityForResult(intent, TAKE_PICTURE);
Run Code Online (Sandbox Code Playgroud)

我想阻止用户拍摄任何风景照片。

任何帮助将不胜感激。

编辑:发现该主题的另一个问题尚未得到解答: How to lock the Camera app Direction Called through Intent in android?

android android-camera-intent

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

R_SH_GOT32意外被Android加载程序进行原子交换()

我的设备无法加载本机库;错误消息是

java.lang.UnsatisfiedLinkError: dlopen failed: unknown reloc type 160 @ 0xa849dc64 (6010)
Run Code Online (Sandbox Code Playgroud)

实际上160R_SH_GOT32并且不应被Android加载程序所期望。

这是最小的代码示例:

#include <atomic>
#define N 3
struct S {
    int a[N];
};

void qq() {
    std::atomic<S> s;
    s.exchange(S());
}
Run Code Online (Sandbox Code Playgroud)

请注意,足以#define N 2正确加载库。

我正在使用NDK r10e,在ARM 32上进行测试,并将仿真器设置为API 4.4.4(API 19)。我尝试了不同的工具链:4.8、4.9和clang。我尝试了gnustl_static和共享,以及libc ++。

这闻起来像是NDK中的错误吗?

更新:使用NDK 11和clang工具链,链接器仅显示

NDK_ROOT / sources / cxx-stl / gnu-libstdc ++ / 4.9 / include / atomic:233:错误:未定义对'__atomic_exchange'的引用

g++ atomic android-ndk c++11

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

为djinni定义const getters

我用djinni定义了一个C++接口:

member = interface +c {
    get_id(): string;
    get_name(): string;
}
Run Code Online (Sandbox Code Playgroud)

我继承的实现使用const getters,即

class MyMemeber: public Member {
  private:
    string id;
    string name;
  public:
    string get_id() const override { return id; }
    string get_name() const override { return name; }
}
Run Code Online (Sandbox Code Playgroud)

由于const属性,这显然无法编译.我可以教djinni用const getters生成基本接口吗?

c++ java-native-interface const djinni

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