关闭

手把手教你 ----JNI的基础实现

标签: JNI
573人阅读 评论(0) 收藏 举报
分类:

距离上一篇博客已经过去20天了.......不知是事情太多,还是太懒了,学习到了很多,总感觉没时间写成博客,却有时间发呆,看新闻.............唉


废话不多说,开始总结!!!


1什么是JNI

JNI是Java Native Interface的缩写 , 后面具体的解释也懒得贴上来 , 我理解的就是Java调用c或者c++代码 。

2准备工作

在用之前  你的Android Studio 必须先安装NDK   具体步骤自行百度(Android Studio 里面自带的)  来个图




File - Settings - Appearance & Behavior - SystemsSetting -  Android SDK - SDK Tool - ndk  然后安装就行 , 我安装的时候不知道是网的原因还是电脑配置的原因 奇慢无比

经过漫长的等待之后 安装完成 , 不过!!别忘了配置环境   下图

      


之后自己在Terminal(View - ToolWindows - Terminal)  里面    输入 ndk-build   javah  java  如果都有回复   则 配置成功


 3开始实战(其实是懒得分步写其他的步骤  直接整合到一步  我真机智哈哈哈)


打开 Local.properties 会有如下配置  则再次验证上一步成功
  


打开  gradle.properties   最下面自己写   

android.useDeprecatedNdk=true

如图    



打开Buidl Gradle (app)   在android - defaultConfig  里面 输入


ndk {
    moduleName "huazict"
    ldLibs "log", "z", "m"
    abiFilters "armeabi", "armeabi-v7a", "x86"
}

里面第一行代表生成.so库的名字

如图


还是这个里面   在android  里面  写如下代码

sourceSets.main {
    jniLibs.srcDir 'libs'
    //下面这行加了不会出现ndk这个文件夹
    //jni.srcDirs = []
}

具体干嘛的  我也不知道  以后估计就明白了  哈哈
如下图



做完这四步 就是配置Android Studio 里面的ndk

好了  接下来 真*开始!!


第一步,新建JNIUtils  这个是要以后调用的

static {
    System.loadLibrary("huazict");
}

//java调用c中的方法都需要用native声明且方法名必须和c中的方法名一致
public native String getString();

第一个里面是.so库的名字   后面是native 方法是要调用的  



之后 Make Project

然后 你会在  projict - app - build - intermediates - classes - debug - com... 下面找到 你新建的JNIUtils的 .class文件




然后找到它的路径   和JNIUtils 的 包名 要做如下整合

路径 :

C:\Users\Administrator\Desktop\JJNI\app\build\intermediates\classes\debug\com\example\administrator\jjni\JNIUtils

包名:

com.example.administrator.jjni.JNIUtils

Therminal命令 应该输入的 :

javah -d jni -classpath C:\Users\Administrator\Desktop\JJNI\app\build\intermediates\classes\debug com.example.administrator.jjni.JNIUtils


然后在 app 下会生成 jni 文件夹 里面有.h文件


接着要在  app - src - main 下新建 jni文件夹(小写)
把.h文件 Ctrl C   Ctrl V 到该文件下下面

然后新建 .c 文件
.c代码如下
#include "com_example_administrator_jjni_JNIUtils.h"

JNIEXPORT jstring JNICALL Java_com_example_administrator_jjni_JNIUtils_getString
        (JNIEnv *env, jobject obj) {
    return (*env)->NewStringUTF(env, "这是我测试的jni");
}

还要新建一个utils.c 不然以后会报错(别问我为啥,我是小白,不知道)

然后 Make Project

就会在    app - build - intermediates - ndk - debug - 出现lib 和 obj  里面都有.so文件  
然后把 lib文件夹下的三个文件夹(里面各有一个.so文件) 粘贴到
src - main 下面 新建的jniLIB 文件夹下面

如图


然后就大功告成了 !! 哈哈 接着在MainActivity里面调用就可以了




----------------------------------------------------------------------分割线----------------------------------------------------------------------------
说一下途中遇到的问题
1,最要注意的一点!!!
.c  和,h  所在的路径(包名) 必须和 里面你写在方法前面的路径一样!!!否则会 报错

  java.lang.UnsatisfiedLinkError Native method not found


这个是你的native 方法没有找到 这个必须要注意!

 名字和你的包名一定要对上!!!如下图






2,不能生成.so文件???
这个具体原因  我也不是很清楚  我只能说说我的情况  因为我也遇到过

我的情况:我第一次用的时候 也是不会生成.so文件 , 并且还报错   报错具体内容没有了......不过里面说的是我的AS没有配置好ndk   让我去重新下一个或者安装插件

我的解决方法:新建一个项目,重新走一遍我写的这些步骤  就好了 ,具体愿意我也不知道,感觉是我之前看了其他网上的JNI使用 每个人写的都不一样  我用混杂了
可能是吧,我重新建一个项目 , 然后按照上面的配置Android Studio ndk  然后MakeProject 就会生成了


3,new JNIUtils. 不出来方法?
哈哈哈   这个估计只有我这个小白才会犯的错
应该是
new JNIUtils().方法  哈哈 之前这里也卡了一会

------------------------------------------------------------------------------分割线------------------------------------------------------------------
最后总结一下步骤:   安装配置NDK  --------   配置环境 --------------------- 配置ASNDK --------------------      写JNIUtils -------------MakeProject 生成.class文件 -------------
Terminal  找路径  包名  编译生成.h 文件   ------------  粘贴到 自己的  main 包下面 的jni文件架下面  -------------   写.c 文件  utils.c ---------------MakeProject 生成 .so文件------
-----------  站到自己的  main 下新建 jniLIB 文件下下面 -------------MainActivity 调用  ----------------大笑 哈哈哈哈













1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

手把手教你安卓入门(一)

很多同学想学安卓应用开发,但是还没有开始就遇到了很多问题,比如资源无法下载,环境搭建遇到问题,代码不知该从何处写起。从0到1的过程让新手们抓狂。
  • anddlecn
  • anddlecn
  • 2016-05-20 15:21
  • 35590

手把手教你学DSP:基于TMS320C55x

书名:手把手教你学DSP:基于TMS320C55x 作者:陈泰红 副书名: 出版日期:2011年8月1日 出版社:北京航空航天大学出版社 页数:348 ...
  • dspers
  • dspers
  • 2014-07-15 17:38
  • 1529

Unity3D新手教学,让你十二小时,从入门到掌握!(三 )

Unity3D新手教学,让你十二小时,从入门到掌握!
  • Aries_H
  • Aries_H
  • 2015-08-16 17:17
  • 16155

利用iphone的多线程实现“售票系统”(手把手教你iphone开发 - 基础篇)

作者:孙东风  2009-11-10 (请尊重作者劳动成果,转载务必注明出处)   http://blog.csdn.net/dongfengsun/archive/2009/11/10/47940...
  • yaokang522
  • yaokang522
  • 2012-01-20 06:57
  • 396

手把手教你高德基础地图+定位+设置Marker实现

一、基础地图部分 1.获取APPKey 在高德地图注册开发者账号,然后创建应用,使用SHA1和PackageName得到Key 2.下载SDK 下载地址:http://lbs.amap.c...
  • pan960821
  • pan960821
  • 2016-03-17 13:38
  • 54071

手把手教你实现百度基础地图+定位功能+设置中心点+添加Marker

配置环境 1.获取AppKey 1.创建应用地址:http://lbsyun.baidu.com/apiconsole/key 2.创建应用: 3.获取SHA1值,首先cm...
  • pan960821
  • pan960821
  • 2016-03-17 17:15
  • 25130

手把手教你使用jni双向调用

一、需求:        项目为cocos2d-X开发的游戏,需要为android版本添加微信分享, 具体是在游戏界面中添加一个分享按钮,点击该按钮即可分享。        最终考虑通过jni,在C/...
  • cangely
  • cangely
  • 2014-02-24 10:52
  • 624

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

当你找到并鬼使神差地打开这个博文的时候,我敢肯定你已经知道什么是JNI,基本概念就不粘贴了。 百度出来的JNI调用方法,前三页几乎毫不例外的都是几年前的资料,告诉你如何设置一大堆莫名其妙的参数、...
  • binyao02123202
  • binyao02123202
  • 2014-01-10 10:03
  • 16482

手把手教你JNI接口编写流程

编译的目标平台为X86架构,本地终端可以直接调用执行。整个构建的流程是从上到下(Java->C)构建。 第一步,编写自己的MyJni.java类,如下: public class MyJni { ...
  • DKBDKBDKB
  • DKBDKBDKB
  • 2016-07-28 18:51
  • 428

09.第五讲.51单片机最小系统下--力天手把手教你学单片机之基础篇

  • 2012-07-20 13:13
  • 67.73MB
  • 下载
    个人资料
    • 访问:24626次
    • 积分:1005
    • 等级:
    • 排名:千里之外
    • 原创:67篇
    • 转载:1篇
    • 译文:0篇
    • 评论:18条
    最新评论