在Android版本开发的过程中,需要使用一些用JNI开发的NDK的native库。这里谈一谈踩到的坑,给大家参考。

虽然java的程序我还算熟悉,但是没有了解过 JNI Native 的开发,一般是直接开发的.Net调用.so库。有一个库是从 Java 代码移植,且没有源码,于是乎碰到了一些问题。
 
一、JNI 对函数的命名是有要求的,.Net则可以直接调用原生看的函数库
       例如monodroid 例子
           [DllImport ("sanangeles", EntryPoint = "Java_com_example_SanAngeles_DemoRenderer_nativeInit")]
           private static extern void nativeInit (IntPtr jnienv);
       java 要求按照 Java_pakcage_class_method进行命名。
      看看Java的声明
      class DemoRenderer implements GLSurfaceView.Renderer {
               public void onSurfaceCreated(GL10 gl, EGLConfig config) {
                                      nativeInit();
                 }
               private static native void nativeInit();
       }
       如果你没有 JNI 的源码,不知道函数声明,你这样写
                [DllImport ("sanangeles", EntryPoint = "nativeInit")]
                 private static extern void nativeInit (IntPtr jnienv);
       那就等玩玩吧,如果你改进Java的源码,一定注意EntryPoint的声明。
 
二、找不到库,指令集的(eabi,eabi-v7a)的问题
       默认调试的情况下,xamarin 调试状态,会根据android环境,选择执行的指令集。问题来了,它不能让你选择。于是乎你的libs只有eabi的.so,就会出现dll无法找到的问题。
       调试状态,把eabi-v7a的目标库也添加进来。或者使用虚拟机的时候,选择armeabi 的环境。
        你可以通过adb shell,到系统中查看库有没有被复制到 /data/app/package/lib 目录。
 
三、JNI 返回String的处理。
       monodroid 介绍的很多方法,是通过 JNIEnv 类反射调用,没有必要非要使用反射方式
       var ver = xxx(JNIEnv.Handle);
       var s = new Java.Lang.Object(ver, JniHandleOwnership.TransferGlobalRef).JavaCast<Java.Lang.String>().ToString();
       
        ver 是  IntPtr,这样避免使用反射,多进行几次转换。
 
建议:
       如果使用NDK编写的函数库只是用monodroid来调用,没有必要使用JNI的规范,这样效率会更高,也无需传入JNIEnv对象。
      

monodroid 调用 JNI Native 的一些问题的更多相关文章

  1. 解决JNI native 线程不能正常退出的问题

    本人刚涉足学习C++ 安卓  java,遇到这个棘手的问题,多谢博客园作者lknlfy 看了你的博客解决了这个问题,此文转发, 方便日后学习 以下内容转自lknlfy作者博客  传送门:http:// ...

  2. 【我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法

    错误描述 今天使用第三方的so库时候,调用JNI方法时出现了错误.报错如下所示: 11-01 16:39:20.979 4669-4669/com.netease.xtc.cloudmusic E/a ...

  3. 手把手教你通过Eclipse工程配置调用JNI完全攻略

    本文地址:http://www.cnblogs.com/wavky/p/JNI.html 当你找到并鬼使神差地打开这个博文的时候,我敢肯定你已经知道什么是JNI,基本概念就不粘贴了. 百度出来的JNI ...

  4. Android调用JNI本地方法跟踪目标代码

    正如Android调用JNI本地方法经过有点改变章所说跟踪代码是可行的,但是跟踪某些代码会出现anr,点击取消,还是不好运,有提高办法吗?回答是有(gdb还没试过,本文只讨论ida). 下面是我使用  ...

  5. Android调用JNI本地方法经过有点改变

    方法注册好后要经过哪些路 Android一个异常捕获项目 https://github.com/xroche/coffeecatch coffeecatch CoffeeCatch, a tiny n ...

  6. java调用jni oci接口宕机原因排查

    调用最简单的JNI没有出错,但是涉及到OCI时就会异常退出,分析后基本确定是OCI 11g中的signal所致,参考ora-24550 signo=6 signo=11解决. 但是这个相同的so库直接 ...

  7. 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10

    关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...

  8. [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法

    原文地址:http://blog.csdn.net/watkinsong/article/details/9849973 有一种方式不需要自己配置所有的Sun JDK, Android SDK以及ND ...

  9. Android NDK环境搭建及调用JNI的简单步骤

    转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3396595.html Java Native Interface (JNI)标准是java平台的一部分 ...

随机推荐

  1. 【转】Linux下Fork与Exec使用

    Linux下Fork与Exec使用 转自 Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.for ...

  2. Linux下的压缩和解压缩命令——zip/unzip

    zip命令 zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有".zip"扩展名 的压缩文件. 选项: -A   调整可执行的自动解压缩文件. -b<工作目录> ...

  3. 各种开源Android 系统定制

    MIUI MIUI是由小米科技开发的Android装置系统.2016年2月24日,MIUI全球用户超过1.7亿.部分开源代码托管在GitHub 官网 国际网站 http://miuiandroid.c ...

  4. IDEA tomcat乱码

    在运行/调试 配置对话框的Startup/Connection面板中, 勾选Pass environment variables. 并添加一个environment variable, Name填 J ...

  5. 转行进入IT前端,目标全栈

    选择进入IT这个行业,未来充满着挑战,未来充满着机遇,互联网已经走入高速稳定的发展正轨了,前端大时代也已经到来了.前端之路怎么走,前端需要不停地学习新知识,跟紧时代的步伐,成为全栈工程师是前端的目标. ...

  6. navicat 破解

    首先上官网上下载LINUX版本: http://www.navicat.com/download 下载 navicat110_mysql_en.tar.gz 文件 下载后解压tar文件 tar -zx ...

  7. Java笔记:Number

    序号 方法与描述 1 xxxValue()将number对象转换为xxx数据类型的值并返回. 2 compareTo()将number对象与参数比较. 3 equals()判断number对象是否与参 ...

  8. C#Linq技术中SelectMany(...)的内部实现推测

    对于声明为:public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable&l ...

  9. jQuery简单倒计时插件

    一. 效果预览 二. 实现 1. 按照特定的类结构布局. 2. 需要先引入jQuery,再引入此文件. /** * Author: CC11001100 * * 简单倒计时 * * 1. 支持页面内同 ...

  10. Andriod学习笔记2:“Your content must have a ListView whose id attribute is 'android.R.id.list'”问题的解决办法

    问题描述 activity_main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <Lin ...