Articles of jni

Android gradle,用于不同架构的本机库

我正在尝试为所有架构构建通用 apk。 这是我的项目结构: -App -appModule -libraryModule -libs -armeabi -lib.so -src -java -jni 这是libraryModule的gradle文件: apply plugin: ‘com.android.library’ // http://stackoverflow.com/questions/28485309/how-to-build-single-apk-with-andoid-ndk-and-gradle android { compileSdkVersion 23 buildToolsVersion “23.0.2” defaultConfig { ndk { moduleName “ProxyResolver” // <– This is the name of AndroidProxy native module stl "gnustl_shared" cFlags "-std=c++11" abiFilters = ['armeabi'] ldLibs (projectDir.absolutePath + "/libs/armeabi/libresolver.so") } } sourceSets { […]

将Java编译为原生Android而不是在C中写入

我们正在寻找一种方法来保护我们的代码并且混淆是不够的。 是否可以将Android Java代码编译为原生Android库? 另一个选择是在c中编写代码并通过JNI自己连接它。 但是我们所拥有的代码非常精细且经过充分测试,对c的重写将开始全面测试。 问候,Rob。 PS:在我们运行x86硬件并使用Excelsior Jet作为保护手段之前。 由于我们想要转向更具成本效益(更便宜)的Arm / android硬件,我们正在寻找一种类似于Jet的类似解决方案,唉只能编译为x86。

如何防止C ++重新编译Android NDK中的所有文件?

你好, 我在一个包含大量C ++文件的项目中使用带有NDK和JNI的Android Studio。 当我在单个C ++文件中进行更改时, 它将不会应用于代码中,除非我重新构建整个项目并刷新整个C ++文件,因此必须重新编译。 每次小改动的编译过程都需要3分钟以上,每天做20次而且你已经失去了一个小时。 根据今天,在我改变文件后,我去了 构建>>刷新链接的C ++项目, 然后运行该项目,导致所有文件的完整,冗余编译。 我正在寻找编译器只刷新更改的文件的方法,因此缩短了构建过程。 注意:此问题仅发生在Windows中,当我在Mac上运行Android Studio时,编译器仅重新编译相关文件。 这是我的CMakeLists.txt文件: cmake_minimum_required(VERSION 3.4.1) FILE(GLOB CPP_SRC “src/main/cpp/*.c” “src/main/cpp/*.h” “src/main/cpp/*.cpp” “src/main/cpp/*.hpp” ) add_library(MyLib SHARED ${CPP_SRC} ) find_library( log-lib log ) target_link_libraries( MyLib ${log-lib} ) target_link_libraries(MyLib android log EGL GLESv2) 和我的gradle.build文件: apply plugin: ‘com.android.library’ android { signingConfigs { config { keyAlias ‘*****’ […]

从Native C / C ++代码调用JAVA类成员

我正在编写一个OpenGL C / C ++应用程序,我通过Android NDK,JNI支持移植到Android。 我在执行从本机发出信号的JAVA回调代码时遇到了困难。 这是代码: class OpenGLSurfaceView extends GLSurfaceView { … public OpenGLSurfaceView(Context context, int deviceWidth, int deviceHeight) { super(context); nativeObj = new NativeLib(); mRenderer = new OpenGLRenderer(context, nativeObj, deviceWidth, deviceHeight); setRenderer(mRenderer); setRenderMode(RENDERMODE_WHEN_DIRTY); } … private void CallBack() { // force redraw requestRender(); } } class OpenGLRenderer implements GLSurfaceView.Renderer { … public […]

如何使用Android NDK修复Eclipse CDT错误“function’isdigit’无法解决”?

我正在使用Eclipse Indigo和Android / NDK混合项目。 我添加了C ++的本质,几乎所有东西都在工作。 自动构建工作; 也就是说,当我编辑文件时,调用ndk-build并成功完成 – 没有构建错误。 鼠标hover代码辅助工作(小窗口popup有关该function的信息)。 如果我将光标放在包含行并按F3,相关的头文件打开(根据我的配置而不是我期望的那个,但是相关的一个 – 可能是一个线索?)。 如果我在.cpp文件中选择以下行,则会打开$ NDKROOT / platform / android-3 / arch-arm / usr / include / ctype.h: #include (isdigit在此文件中定义) 但是,Eclipse坚持认为isdigit没有定义。 我已经阅读了许多post,建议静态分析器或索引器应该受到指责,但我已经尝试了许多建议的解决方案无济于事。 如果我添加如下所示的行,则错误消失,鼠标hover代码帮助该function工作: extern int isdigit(int); 同样,这不是链接器错误或编译器错误 – ndk-build完成且没有错误。 这是日食里面的东西。 谢谢参观! 编辑:我现在认为这是一个代码分析问题。 更好的解决方案是编辑代码分析选项以使“无法解析function”成为警告而不是错误。 这样您可以在“问题”视图中看到警告,但继续工作。 如果函数真的丢失了,编译器会告诉你! 我还有一个新理论,问题在于符号链接后的代码分析器,因为所有“缺失”函数都在符号链接的包含文件中。 会喜欢这个理论的任何意见。

为android活动类创建头文件

我已经为我的android Activity类添加了一些本机方法。现在我想为class创建头文件。 从命令行创建头文件时出现以下错误。 C:\AndroidProjects\JniTest\bin\classes>javah -classpath .; C:\adt-bundle-windows-x86\sdk\platforms\android.jar com.example.jnitest.JniTest Error: cannot access android.app.Activity class file for android.app.Activity not found 基本上无法从jar访问活动类。 请指教。

在Android上集成或构建libjpeg-turbo的说明

可以在互联网上find各种页面,提到Android的libjpeg-turbo( 示例 )。 它们都指向存储库,并说要阅读ANDROID.txt以获取构建指令。 但是,存储库中没有这样的文本文件。 这个存储库是获取Android的libjpeg-turbo的官方地方吗? 如果是这样,构建/集成指令在哪里?

如何在Android应用程序中使用NDK构建的库时捕获UnsatisifiedLinkError?

我有一个Android项目,其中包含一个使用JNI从C函数中提取值的类。 使用NDK将C函数内置到库中。 从C函数返回的值又用于在类首次加载时初始化类中的variables。 这很好用。 但是,我还希望它在缺少库时通过提供默认值来工作。 所以我使用这样的东西: static native String getstring(); static { try { System.loadLibrary(“library”); NAME = getstring(); } catch (Exception e) { NAME = “Default”; } } 尽管有这个问题,但当我尝试在缺少库的情况下运行此代码时,我仍然得到一个UnsatisfiedLinkError。 为什么我没有抓住exception? 我究竟做错了什么?

如何减少需要openCv lib的Android应用程序的apk大小(仅用于image processing)

我正在使用min SDK 15构建一个Android应用程序,该应用程序使用的是OpenCV库。问题是当我构建apk时,它的大小超过60 MB,这不是很好。 我检查了应用程序文件,由于amr64 , armeabi , mips , x86等所有架构中的amr64文件,我可以看到大小太大。 我只使用opneCv进行image processing。这个库有许多其他function,如video处理,3D图像,对象检测等等,我不需要在我的应用程序中像 如果我删除所有这些文件并构建APK,那么大小将减少50 MB,但为了使这个应用程序工作,我需要安装OpenCVManager来运行我的应用程序。 有什么方法可以减少我的apk大小? 或者只是从OpenCV提取我感兴趣的function并为这些function创建.so ?

带有utf8字符的jstring(JNI)到std :: string(c ++)

如何使用utf8字符将jstring (JNI)转换为std::string (c ++)? 这是我的代码。 它使用非utf8字符,但utf8字符是错误的。 std::string jstring2string(JNIEnv *env, jstring jStr){ const char *cstr = env->GetStringUTFChars(jStr, NULL); std::string str = std::string(cstr); env->ReleaseStringUTFChars(jStr, str); return str; }