Android studio使用JNI实例
2017-07-26 16:06
253 查看
发现网上很多JNI的使用教程,也很详细,不过有的地方有些缺漏,导致很多小问题难以解决的,今天就来总结一下。
准备工作:下载NDK。
简单的说,要用到C/C++,就要用NDK。直接百度搜索然后去官网下载就行,位置可以随便放。
1、新建一个类,声明native方法。这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。
不在Activity类里面写是为了避免编译时报错:找不到android.support.v7.app.AppCompatActivity
2、打开android studio终端,使用javac编译上述文件,生成class文件。
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803162126856-1467052994.png)
命令:
3、确认自己类的包名!然后在上一级的位置使用javah生成.h头文件
一定要在上一级哦,不然不会报错:找不到xxx类
比如我的myJNI.class在
我的包名是:
所以我的javah命令应该这么写:
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803162749090-2121310190.jpg)
然后就能看到生成了一个h文件。
4、新建一个jni文件夹,新建main.c,把.h里面的内容复制进去,并实现里面的函数。
生成的h文件
拷贝修改后的main.c
还要在jni文件夹下添加一个空白的util.c文件,不然会报错,我也不知道为什么。
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803163831872-1055294056.png)
5、配置NDK
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164038997-1584383621.png)
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164349106-1193222717.png)
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164509512-513327347.png)
6、生成SO库
完成以上步骤之后,我们rebuild一下就可以生成so库了
在项目的app\build\intermediates\ndk\debug\lib路径下
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164721809-359071506.png)
7、配置so库
在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164937840-829767712.png)
8、使用JNI
因为native方法声明成了静态的方法,在Activity里面直接调用myJNI类就行
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803165206887-467160565.png)
ok!
总结一下流程:
编写静态方法(用java声明)-->编译生成class文件--->编译生成h文件---->编写C文件(用C/C++实现)
---->配置NDK---->配置so库---->在Activity调用(Java调用C/C++)。
android studio虽然很多小问题,但也算很方便了,mk文件编辑器帮你弄好了,直接可以生成so库。
准备工作:下载NDK。
简单的说,要用到C/C++,就要用NDK。直接百度搜索然后去官网下载就行,位置可以随便放。
1、新建一个类,声明native方法。这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。
不在Activity类里面写是为了避免编译时报错:找不到android.support.v7.app.AppCompatActivity
public class myJNI { //加载so库 static { System.loadLibrary("JniTest"); } //native方法 public static native String sayHello(); }
2、打开android studio终端,使用javac编译上述文件,生成class文件。
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803162126856-1467052994.png)
命令:
D:\AndroidStudioProject\testJNI\app\src\main\java\com\example\binbin\testjni>javac myJNI.java
3、确认自己类的包名!然后在上一级的位置使用javah生成.h头文件
一定要在上一级哦,不然不会报错:找不到xxx类
比如我的myJNI.class在
D:\AndroidStudioProject\testJNI\app\src\main\java\com\example\binbin\testjni
我的包名是:
package com.example.binbin.testjni;
所以我的javah命令应该这么写:
D:\AndroidStudioProject\testJNI\app\src\main\java>javah -jni com.example.binbin.testjni.myJNI
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803162749090-2121310190.jpg)
然后就能看到生成了一个h文件。
4、新建一个jni文件夹,新建main.c,把.h里面的内容复制进去,并实现里面的函数。
生成的h文件
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_binbin_testjni_myJNI */ #ifndef _Included_com_example_binbin_testjni_myJNI #define _Included_com_example_binbin_testjni_myJNI #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_binbin_testjni_myJNI * Method: sayHello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
拷贝修改后的main.c
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_binbin_testjni_myJNI */ #ifndef _Included_com_example_binbin_testjni_myJNI #define _Included_com_example_binbin_testjni_myJNI #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_binbin_testjni_myJNI * Method: sayHello * Signature: ()Ljava/lang/String; */ //就实现了个函数 JNIEnv的用法可以自行百度,这里就不展开了 JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello (JNIEnv *env, jclass jobj){ //返回一句话 return (*env)->NewStringUTF(env,"JNI hahahahahahahaha"); } #ifdef __cplusplus } #endif #endif
还要在jni文件夹下添加一个空白的util.c文件,不然会报错,我也不知道为什么。
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803163831872-1055294056.png)
5、配置NDK
打开Project的local.properties文件添加NDK路径
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164038997-1584383621.png)
打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码 注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk { moduleName "JniTest" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" }
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164349106-1193222717.png)
还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164509512-513327347.png)
6、生成SO库
完成以上步骤之后,我们rebuild一下就可以生成so库了
在项目的app\build\intermediates\ndk\debug\lib路径下
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164721809-359071506.png)
7、配置so库
在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803164937840-829767712.png)
8、使用JNI
因为native方法声明成了静态的方法,在Activity里面直接调用myJNI类就行
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView)findViewById(R.id.text); //调用 text.setText(myJNI.sayHello()); } }
![](http://images2015.cnblogs.com/blog/844215/201608/844215-20160803165206887-467160565.png)
ok!
总结一下流程:
编写静态方法(用java声明)-->编译生成class文件--->编译生成h文件---->编写C文件(用C/C++实现)
---->配置NDK---->配置so库---->在Activity调用(Java调用C/C++)。
android studio虽然很多小问题,但也算很方便了,mk文件编辑器帮你弄好了,直接可以生成so库。
相关文章推荐
- JNI使用实例:Android Studio使用JNI编译so库
- Android Studio JNI使用实例
- Android Studio JNI使用之个人笔记
- Android Studio JNI配置及.so库使用
- Android Studio NDK环境配置及JNI使用方法
- Android Studio2.2中JNI的简单使用
- Android之JNI:Android Studio使用Android.mk编译C/C++源码
- android studio JNI使用
- 解决Android内存泄漏--MAT\android studio使用方法实例
- android studio JNI/NDK的简单使用
- 使用android studio JNI报错 undefined reference to '__android_log_print'
- AndroidStudio Cmake学习--如何漂亮的使用jni
- 实现Android Studio JNI开发C/C++使用__android_log_print输出Log
- JNI for Android, Android Studio NDK 入门 实例 demo
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- Android Studio 如何使用jni
- 一、android studio JNI 的简单编写使用。
- android studio JNI使用
- android studio JNI使用
- Android Studio cmake方式jni开发,在c层使用其它动态链接库*.so