android studio jni开发的第一个范例
来源:互联网 发布:手机淘宝店铺关注按钮 编辑:程序博客网 时间:2024/05/19 23:54
jni开发主要应用是java调用c/c++对底层进行的一些操作,建议对这部分东西不了解的童鞋可以去看一看《java核心技术2》中的最后一章“本地方法”(非打广告,只是最近在看这本书的时候看到了这部分,各位看官知道其它更好的资料的欢迎推荐)里面有一些基础的描述,或许有助你更好的了解这部分内容,下面进行的步骤,可能忽略了一些基础的知识,如有不懂的地方,可以提出来大家一起分析。
- 首先在android studio新建一个工程SptUsrC.
- 在main/java/com.tek.spt.sptusrc目录下新建一个UtilJni.java文件,文件内容如下,请注意,这个文件中的“getHelloString()”会一直保持红色,不影响进行下面的操作:
public class UtilJni { public native String getHelloString();}
同时我们需要修改一下MainActivity.java这个文件,以便更好的展示代码执行的效果(activity_main.xml中需要增加一个R.id.test的对象,请各位看官自行添加,谢谢):
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) this.findViewById(R.id.test); UtilJni jni = new UtilJni(); mTextView.setText(jni.getHelloString()); }
- 编译这个工程,使用菜单“build —>make project”,执行该步骤的目的是为了在”build/intermediates/classes/debug/com/tek/spt/sptusrc/”目录下生成UtilJni.class文件,其实这一步就是我们通常在教材中使用
的”javac UtilJni.java”的作用是一样的,目的都是为了生成UtilJni.class文件。 - 点击AS的Terminal标签 ,进入到“build/intermediates/classes/debug”这个目录下,执行“javah com.tek.spt.sptusrc.UtilJni ”,生成文件com_tek_spt_sptusrc_UtilJni.h.针对这个指令,我们有必要说明一下,在普通的java教程里我们看到的应该是“javah UtilJni”这样的写法,但是在android studio里面不能这样直接,“javah com.tek.spt.sptusrc.UtilJni”这个的结构是这样的“javah 包名.类名 ”,请注意,一定要在“build/intermediates/classes/debug”这个目录下才是有效的,否则,就需要再修改一下javah 这个指令,在前面需要加上路径,在debug这个目录下是和我们java教程上的吻合的写法,这个是最基本的方法,其它方法的话暂时不推荐,因为有一个循序渐渐的过程。
- 在main目录下新建jni目录,把我们刚才生成的com_tek_spt_sptusrc_UtilJni.h文件拷贝到该目录下。
- 在jni目录下新建c文件UtilJniC.c,写入的内容主要有,请注意,UtilJniC.c中要写的函数,就是com_tek_spt_sptusrc_UtilJni.h中定义的JNIEXPORT jstring JNICALL Java_com_tek_spt_sptusrc_UtilJni_getHelloString(JNIEnv *env, jobject cl),这是从.h文件中拷贝的,请各位一定不要自己去写这个函数名,一定是用拷贝的方式粘贴过来,避免很多不必要的可能出现的问题。
a. #include “com_tek_spt_sptusrc_UtilJni.h”
b. JNIEXPORT jstring JNICALL Java_com_tek_spt_sptusrc_UtilJni_getHelloString(JNIEnv *env, jobject cl)
7.请检查你的ndk和sdk是否配置好,编译过程中,如果ndk的版本差异可能导致很多不一样的问题, 所以如果根据上面的编译过程中出现问题,请一定检查你的ndk的版本,如果你无法排查出其它问题,可以换一个ndk版本进行编译,这一点非常重要,一定要引起重视。
8.在app module目录下的build.gradle中设置库文件名(生成的so文件名),
ndk{ moduleName "SptBlood" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。 }
- 最后一步,回过头来在UtilJni.java文件加入下面的语句
static { System.loadLibrary("YanboberJniLibName"); //defaultConfig.ndk.moduleName }
最后的UtilJni.java文件的内容如下所示:
public class UtilJni { static { System.loadLibrary("SptBlood"); //defaultConfig.ndk.moduleName } public native String getHelloString();}
还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true
这句话请一定要加上,当ndk不匹配的时候会造成
“Error: Your project contains C++ FILES BUT IS NOT USING A SUPPORTED NATIVE BUILD SYSTEM.”这样的报错,所以最保险的方法是,不管你的idk是什么版本,请一定要加上这句话。最后一步就是编译运行apk了。最后再说一句, 如果你没有编译成功,可以考虑换一个ndk版本,首先一定要保证ndk版本的正常,否则会出现很多小问题, 浪费你宝贵的时间。
- android studio jni开发的第一个范例
- Android Studio开发JNI - 第一个JNI程序
- MAC环境下Android Studio的第一个JNI程序
- Android Studio第一个jni程序
- Android Studio 第一个JNI程序
- Android Studio 第一个JNi工程
- Android开发教程--第一个JNI程序
- 第一个JNI开发
- 使用Android Studio 创建第一个JNI Helloword
- Android studio下jni的配置和第一个helloword程序
- Android studio NDK笔记1-NDK配置,你的第一个JNI
- 我的第一个Android JNI程序
- Android Studio开发JNI
- Android Studio JNI开发
- Android Studio jni开发
- Android Studio jni开发
- android studio Jni开发
- Android studio JNI开发
- matlab---之squeeze函数
- Spark Streaming 流计算优化记录(4)-时间都去哪儿了,关于调度与空转
- CCF 引水入城
- python pickle模块 序列化
- 找到一个学习caffe的好地方
- android studio jni开发的第一个范例
- c语言编程常见错误集锦
- 使用atp-get安装Python-pip时遇到如下问题,附解决方案
- nginx 配置http请求重定向至https
- Echart元素说明
- Spark Streaming 流计算优化记录(5)-分区与内存的优化
- 旋转 变色 缩放
- U-boot makefile 解读
- js获取浏览器内核信息