我有一个很大的C文件库,它依赖于OpenSSL,我对使用本机库非常陌生,尤其是使用android的新手.我已经成功地在iOS上实现了这个库而没有任何问题.
我一直在网上寻找有关如何做到这一点的教程/信息,但到目前为止我还没有发现任何我能理解的内容.这对我来说都很困惑.
本质上我正在试图弄清楚如何使用NDK将C文件库编译成本机库,并使用imy android应用程序编译库.
根据我的理解,我需要一个自定义的cmake文件用于android本身,但我不知道从哪里开始,我发现的文档非常难以理解.
所以,我需要一些帮助来理解在以下庄园中编译库的过程:
(我已经设法为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) 当我第一次运行异步任务时,它可以正常工作。实际上,此错误是无法预料的。我在这个问题上搜索了很多解决方案,但对我来说没有任何用处。我得到的常见解决方案是,我们需要关闭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项目中,我定义了一些回调来对按钮单击,连接事件或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的进步使这个问题过时了,请参见已接受的答案。
我有下一个问题:
当我尝试启动相机时,我可以拍摄照片,甚至将其保存在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
我的 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) 我用这个代码来使用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) 我知道我可以在清单中设置活动的方向,但是当此活动调用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?
我的设备无法加载本机库;错误消息是
java.lang.UnsatisfiedLinkError: dlopen failed: unknown reloc type 160 @ 0xa849dc64 (6010)
Run Code Online (Sandbox Code Playgroud)
实际上160是R_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'的引用
我用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生成基本接口吗?