Android studio JNI开发

这里的JNI开发是旧方法,在这里仅做记录使用,
最新官方版已经默认使用cmake来编译:http://www.jianshu.com/p/2f3e0f589520

说明:图片仅做效果展示,并不是JNI工程截图。
1、编译环境的搭建
正所谓:“工欲善其事必先利其器”嘛,所以先把改准备工具准备一下,因为是在studio下编译的,所以啊,什么studio、什么sdk、什么jdk,这些都自己去弄吧,这里说一下ndk这个编译C文件工具怎么下载安装;
下载链接:https://developer.android.com/ndk/downloads/index.html(需要翻墙)进去之后下载自己相对应的ndk平台版本;
下载完了之后直接是一个zip的压缩包,解压即可;
然后如下图所示的配置ndk:
![](http://upload-images.jianshu.io/upload_images/2687636-e99f6c92d7f46bea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

然后你会在local.properties文件中看到:
![](http://upload-images.jianshu.io/upload_images/2687636-5310f34175d5fd71.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

不要急,还没有完,ndk环境搭建还有最后一步,在gradle.properties的文件末尾加上android.useDeprecatedNdk=true这段代码,文字看不懂吧直接上图:
![](http://upload-images.jianshu.io/upload_images/2687636-0c80b9dacd6e2f82.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
好了,到此处环境就搭建完毕了。
2、java代码和C代码的编写步骤及过程
首先新建一个java类JNIUtils.java

public class JNIUtils {
 static
   {      
   System.loadLibrary("huazict");
   } 
//java调C中的方法都需要用native声明且方法名必须和c的方法名一样
public native String getString();
}

然后如下图所示重新Make Project一下工程:![](http://upload-images.jianshu.io/upload_images/2687636-f728ba66ae540f73.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

会在工程目录E:\work\MyApplication\stujni\build\intermediates\classes\debug\com\huazi\stujni\jni中看到自己编译后的class文件JNIUtils.class如下图所示:
![](http://upload-images.jianshu.io/upload_images/2687636-25483a83c5d9e6ba.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

其次就是生成.h文件了
在studio打开Terminal命令行工具,打开步骤是View->Tool Windows->Terminal (或直接按Alt+F12)

然后在命令行中先进入到工程的classes目录下

 cd  /..../app/build/intermediates/classes/debug

javah -jni 包路径+文件名:

  javah -jni com.huazi.stujni.jni.JNIUtils

或者输入命令:javah -d jni -classpath 自己编译后的class文件的绝对路径:

javah -d jni -classpath E:\work\MyApplication\stujni\build\intermediates\classes\debug com.huazi.stujni.jni.JNIUtils(注意debug后的空格)

命令行中目录下会生成.h头文件,新建JNI文件夹如下图:


Paste_Image.png

这个文件.h文件不需要做任何修改,默认即可。
现在我们来写一个test的C文件huazict.c同.h文件一样放到jni文件夹下,代码如下:

#include "com_huazi_stujni_jni_JNIUtils.h"

/**

 
* 上边的引用标签一定是.h的文件名家后缀,方法名一定要和.h文件中的方法名称一样

 
*/

JNIEXPORT jstring JNICALL Java_com_huazi_stujni_jni_JNIUtils_getString

        
(JNIEnv *env, jobject obj) {

    
return
(*env)->NewStringUTF(env,
"这是我测试的jni"
);

}

如图所示:![](http://upload-images.jianshu.io/upload_images/2687636-782d4cf6e0ccc298.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后在构建文件中的默认配置中加上:


//ndk编译生成.so文件  
ndk {
           moduleName "JpgLib"
           abiFilters "armeabi", "x86", "armeabi-v7a"//"arm64-v8a","x86_64"
           ldLibs "log"
       }

如图:
![](http://upload-images.jianshu.io/upload_images/2687636-219478d4e8c1903e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
到这里,通过jni调C就完成了

三、调用编译过的.so库
上边编译完成了,有人会问:我要的是编译后的.so库,别人用的时候直接拿来用就可以了,那编译后的.so库在哪呢?不要着急请看下图:
![](http://upload-images.jianshu.io/upload_images/2687636-6a6678165371cbcf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

根据这个路径就可以找到指定输出的三种体系结构下的.so库文件,然后把.so文件复制出来,如下图所示的放到相应的文件夹下就ok了:
![](http://upload-images.jianshu.io/upload_images/2687636-4370205734b7f0ce.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
再次运行,结果还是一样的,跟上边贴的那张图的显示效果是是一样的,同样能调用到,代码我就不上传了,都在上边贴上去了,而且也上传不了,公司的所有文件都是加密的,想上传都上传不了。
到这里,整个jni的调用过程就结束了,包括调用jni需要的环境以及调用的过程,最后.so文件的导出,都在上边了,如果上边的jni调用过程有什么问题,欢迎留言,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容