• so文件编译生成后,运行时,有时候会遇到java.lang.UnsatisfiedLinkError: Native method not found问题,有可能是以下三种因素:一、Jni方法头部大小写问题 在C++中,方法名:Java_com_XXX,而不是java_com_XXX。...

            so文件编译生成后,运行时,有时候会遇到java.lang.UnsatisfiedLinkError: Native method not found问题,有可能是以下三种因素:

    一、Jni方法头部大小写问题     

    在C++中,方法名:Java_com_XXX,而不是java_com_XXX。建议直接从生成的.h头文件直接复制方法名到C或者C++文件中。

    二、C++文件问题

            如果是C++文件(.cpp或者.cc),要使用extern "C" {   } 把本地方法括进去。

    三、往Jni方法中传值问题

             如,调用native方法sendSomeThing(Object object),如果传入的object为null,有可能会报上面错误。


    展开全文
  • Caused by: java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/android-arm/libjnidispatch.so) not found in resource path (.) 因为自己的 jniLibs 下的目录结构为: android-aarch64 android-armv...
    Caused by: java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/android-arm/libjnidispatch.so) not found in resource path (.)
    因为自己的 jniLibs 下的目录结构为:
    android-aarch64
    android-armv7
    
    
    android studio 的结构应该是:
    arm64-v8a
    armeabi-v7a
    
    改成这两个名字即可
    
    
    展开全文
  • Android libdvm.so 与 libart.so 系统升级到5.1之后,发现system/lib/下面没有libdvm.so了,只剩下了libart.so。对于libart模式,从4.4就在Developer optins里面就可以手动选择,到5.1算是转正了。 1,...
    Android libdvm.so 与 libart.so
    

    系统升级到5.1之后,发现system/lib/下面没有libdvm.so了,只剩下了libart.so。对于libart模式,从4.4就在Developer optins里面就可以手动选择,到5.1算是转正了。

    1,什么是libdvm,libart。
    Android KK里引入了ART虚拟机作为Dalvik虚拟机的替代,其主要目的是把Bytecode的翻译优化从运行时提前到安装时,以空间换时间,从而达到更流畅的用户体验。目前,KK中Dalvik仍是默认的虚拟机,但用户可以在Developer Option中切换到ART虚拟机。坊间传闻在下一版可能会转正。Dalvik和ART的实现分别位于libdvm.so和libart.so这两个库。两个可以同时build也可以只build一个,通过Makefile中的变量PRODUCT_RUNTIMES来控制(https://source.android.com/devices/tech/dalvik/art.html)。ART本质和Dalvik是一样的,是将Java的Bytecode翻译成Native code。它的主要的实现代码在AOSP的art目录下,另外在libcore/libart/下还有一部分Java层的实现。

    2,dex翻译成机器码,在libdvm模式下和Libart模式下是有区别的
    framework/native/cmds/installd/commands.c
    涉及到的命令有dex2oat和dexopt
    libdvm是运行时翻译;
    libart是在install的时候翻译。

    3,这些实现的逻辑在zygote的创建有关。

    展开全文
  • 用eclipse编写Android NDK程序时,会出现 java.lang.UnsatisfiedLinkError: Native method not found:问题 错误排除一:严格按照以下步骤编写程序:a:建立引用外部函数的java类
        用eclipse编写Android NDK程序时,会出现
    

    java.lang.UnsatisfiedLinkError: Native method not found:问题

    错误排除一:严格按照以下步骤编写程序:
                 a:建立引用外部函数的java类
                 b:javah 生成.h文件
                 c:复制.h文件中的JNIEXPORT jint JNICALL Java_**()方法
                 d:编辑.cpp文件配置相关属性,编译程序未出现错误,在libs目录中成功找到**.so文件
                 e:运行程序出现java.lang.UnsatisfiedLinkError: Native method not found:的问题
    错误都排除,但是还是提示这个问题,这个时候应该就抓狂了,这时候请注意,你有加载.so库嘛?这种错误对于初学者来说很容易犯,尤其是对于要学习opencv而学习NDk的人来说。
    第一:在MainActivity中加入
    static{

    System.loadLibrary("***");//这里的**是你在Android.mk文件中的LOCAL_MODULE 。即.so文件(注意不要lib)

    }
    第二:去掉Android.mk中的include ../OpenCV_sdk/native/jni/OpenCV.mk

    注意:第二步是针对学习opencv的人来说,学习有时会急于求成或粗心大意没有注意到这些错误。
    展开全文
  • Android编写.so入门介绍

    2018-01-16 14:37:11
    Android开发中,我们经常会用到.so文件。原因有很多,比如部分方法不想暴露,如加密规则。比如部分秘钥需要存储,哪怕最简单的一个加盐的String。我们使用.so调用获取这个String,也比直接明文写在代码中要来的安全...

    Android开发中,我们经常会用到.so文件。原因有很多,比如部分方法不想暴露,如加密规则。比如部分秘钥需要存储,哪怕最简单的一个加盐的String。我们使用.so调用获取这个String,也比直接明文写在代码中要来的安全。所以就需要我们安卓开发的同学,要知道简单的.so怎么编写。今天为大家带来一篇,如何通过Native方法,从.so中获取一个字符串(可以存储秘钥哦)。

    Native开发,那就需要对应的NDK的环境。使用Android Studio开发的同学就会很简单了。当然,我一开始也不会,也是通过搜网上的代码,只是因为网上的代码有些生硬,不容易理解。我硬是弄了一下午,可能水平也不够,那我就写的简单一点。

    一、配置Android NDK location

    打开local.properties

    如果页面已经包含了ndk.dri 以及sdk.dir 那就说明你已经配置过NDK的路径了(忽略下面的步骤,直接到第二步)


    如果你没有配置过,那就打开配置SDK以及JDK的地方。最下面这个就是NDK。从网上下载NDK,配置好环境。

    二、配置gradle.properties(如下图)


    打开这个页面可以看到


    这里需要重点说明一下。

    一般情况下配置的是

    android.useDeprecatedNdk=true

    如果出现以下错误

    Error:Execution failed for task ':app:compileDebugNdk'.
    > Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio.  Please switch to a supported build system.
      Consider using CMake or ndk-build integration. For more information, go to:
       https://d.android.com/r/studio-ui/add-native-code.html#ndkCompile
       To get started, you can use the sample ndk-build script the Android
       plugin generated for you at:
       /Users/Xiaonima/MyJniTest/app/build/intermediates/ndk/debug/Android.mk
      Alternatively, you can use the experimental plugin:
       https://developer.android.com/r/tools/experimental-plugin.html
      To continue using the deprecated NDK compile for another 60 days, set 
      android.deprecatedNdkCompileLease=1516073275899 in gradle.properties

    说明你的Android studio的版本是3.0以上的,提示说你的NDK有问题了,这个应该是过期了,英语不好,没仔细看。

    注释掉android.useDeprecatedNdk=true

    加上这个配置

    android.deprecatedNdkCompileLease=1511832698813

    三、开始编写我们的Native方法

    到了这里,环境已经搭配好,我们开始正在写需要调用的方法。这里就以最简单的,通过Native方法获取一个字符串。

    创建一个类。先写好需要加载的.so(我们最终创建好以后的.so名)。以及写上你需要调用的Native方法名。


    我这边就是最简单的,加载我这个.so 然后静态的native方法。

    类创建完,以及定义好方法以后。Build --> Make Project



    四、通过terminal控制台编译

    如果顺利的同学到了这个时候可以在这里查看到这个.class 的文件



    这个时候说明我们的定义Native方法成功了。然后我们就需要通过控制台命令,生成对应的.h文件。

    首先我们需要知道,我们目前处在最外层的文件夹。同时,我们需要生成一个.h的文件到main的jni 的文件夹下。

    这个时候我们先 cd app/src/main 这个时候先到指定的main路径下 执行javah -d jni -classpath (之前带你们查看的那个.class文件的路径)

    如 下图: 一直到debug 为止 然后再加上包名 和对应的.class的文件名(后缀不要)

    说明一下,如果不成功,可能是你的sdk 没有配置环境变量,这里不详细讲解。不会的同学,可以上网搜索。


    五、创建对应的.c文件

    如果到了这里都没有问题的同学,这个时候会发现我们的main目录下多了一个jni的目录,点开目录可以看到我们之前通过控制台生成的.h文件。

    我们不用去管这个生成的对应的.h文件。我们直接在下方创建一个.c的文件。


    #include "com_jni_xiaonima_myapplication_NativeUtils.h"
    /**
     * 上边的引用一定要和.h的文件名加后缀,
     * 下面的方法名一定要和.h文件中的方法名称一样
     */
    JNIEXPORT jstring JNICALL Java_com_jni_xiaonima_myapplication_NativeUtils_getStringFromNative
                (JNIEnv *env, jobject obj) {
            return (*env)->NewStringUTF(env, "小尼玛其乐无穷");
    }

    直接贴出代码,容易复制。认真看我的注释。

    这个地方就是 通过Native方法 获取返回值,具体不要问我代码怎么写,C代码我也不会。

    六、最后配置一下生成 .so

    如果你一直到了这里,那么我即将要恭喜你,终于到了最后了。打开app下对应的build.gradle。

    在我写注释的地方配置你需要支持的.so文件。


    //ndk编译生成.so文件
    ndk {
        moduleName "xnmjni"         //生成的so名字
        abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。
    }

    贴出代码,方便复制。

    七、生成.so文件。

    终于走到最后一步了。

    我们配置好了上面的build.gradle 以后,使用Rebuild。不知道在哪里的同学需要打头了。

    这个时候我们可以在如下图位置,发现生成了刚刚配置的对应的.so文件。直接复制出来,放到对应的目录下。jni目录路径如果你没有指定过。

    那就有默认的规则,统一在main目录下,新建一个jniLibs。一定不要命名错误,文件位置也千万不要错误。否则会加载失败。




    总结:  生成完了.so 那么对应的jni里面的c代码就不需要了。你可以删除,可以保存到别的地方。总之,你开心就好。

    一般自己动手操作个2 - 3遍就能熟练掌握生成.so的方法。当然如果要具体写C代码的实现,那么就需要继续学习一下C代码了。

    文中有任何错误,请指正,接收一切批评。

    最后再说明一点,生成的.so 会在名字前面加上lib***.so(说明一下,不要管这个lib 以及这个后缀)我们在调用的时候就是这个***就可以了。

    展开全文
  • 在本地使用.so库时,偶尔会出现java.lang.UnsatisfiedLinkError: Native method not found 异常,产生原因可能如下: 1,生成的.h头文件中 Java没有大写。例如: JNIEXPORT void JNICALL java_...
  • 1、.so库没有加载或加载失败 3、JNI方法头部大小写问题   在C++中,方法名:Java_com_XXX,而不是java_com_XXX。建议直接从生成的.h头文件直接复制方法名到C或者 C++文件中。 3、C++文件问题  如果是C++文件...
  • android native 代码内存泄露 定位方案 java代码的内存定位,暂时我们先不关注。此篇文章,主要围绕c c++代码的内存泄露。 ** *欢迎留言,交流您所使用的内存泄露定位方案。*c c++代码,由于其特殊性质,没有...
  • 安卓native项目,接入sdk的时候,当第三方库中包含.so文件,我们把.so文件放到安卓工程的armeabi,armeabi-v7a 等文件夹下面的时候,然后再运行该项目,编译的时候,是会删掉对应的.so文件,然后重新生存.so文件的,...
  • android studio JNI开发报错:java.lang.UnsatisfiedLinkError: Native method not found:... 的解决措施
  • 错误: 严重: Exception sending context initialized event to listener instance of class com.ldsoft.util.cache.InitCacheListener...Java.lang.UnsatisfiedLinkError: Native Library D:\Program Files\tomcat-6
  • androidnative_bridge

    2018-05-29 14:51:40
    这里主要是在X86上跑ARM后续的均以android6.0为例在加载so文件的时候。最后调用到了art/runtime/java_vm_ext.cc当中的JavaVMExt::LoadNativeLibrary void* handle = dlopen(path_str, RTLD_NOW); bool needs_...
  • android如何使用.so文件

    2018-09-12 14:43:29
    最近正在学习ndk开发,一直百度啊百度...此片先记录下如何集成.so文件,so文件是我自己生成的一个demo中copy出来的。二话不说直接上代码吧。 apply plugin: 'com.android.application' android { compileSdkVersi...
  • No implementation found for native Lxxx, java.lang.UnsatisfiedLinkError: XXX时的解决办法
  • Android native memory leak detect (Android native泄露检测) 简介 Android应用中,经常会有业务需要使用到Native实现。比如加密,音视频播放等。也就是常见的二进制文件xxx.so 这部分代码,申请的内存不走...
  • app在打开时弹窗提示libdpush_v2_3.so:unauthorized access to "libssl.so",libmsc.so:text relocations,libdpush_v2_3.so:unauthorized access to "libcrypto.so" 之后发现是因为百度推送的sdk和讯飞的sdk版本过老...
  • 系统升级到5.1之后,发现system/lib/下面没有libdvm.so了,只剩下了libart.so。对于libart模式,从4.4就在Developer optins里面就可以手动选择,到5.1算是转正了。 1,什么是libdvm,libart。 Android ...
  • 现在智能家居很火,有很多的云平台提供者,也有很多智能设备提供者,例如智能摄像头,偶然的机会我接触了一款智能摄像头PnP网络摄像头,就下载了他的sdk玩了一下,简单记录一下调用so库踩的坑。 PnP网络摄像头的demo...
  • 最近项目中使用NDK遇到一些问题,由于项目要打成jar包提供给其他人用,遇到一些平时apk使用.so时没有遇到的问题,在网上找了很多资料都没有说明,经过很长时间探索,终于把相关问题解决了,有几个注意的地方分享给...
1 2 3 4 5 ... 20
收藏数 43,512
精华内容 17,404
关键字:

.so android native