Android(安卓)studio下的Android(安卓)JNI调用以及动态链接库.so的生成
什么是JNI:
JNI(Java Native Interface)提供了Java和其他语言交互的一个接口,为什么说是接口呢,因为如果你用想用C++实现一个简单的两个数字加减的方法并把值返回,那么就需要首先在AndroidJniUtils.java(就是你写的调用C代码的接口类)类中像定义接口方法一样来预定义一个方法,而具体实现其实使用的就是你的C代码了。
JNI的使用场景
①你的一些功能算法已经用c代码实现过了,可以直接用JNI调用而不用在java语言重新写一遍。
②你对某一些算法运算或图形渲染的性能要求很高,在优化了又优化之后你感觉java还是不能达到你最理想的速度,使用JNI调用c代码实现这个算法,那样会更快一些。
③对于Android API而言,你要调用API没有访问过的手机硬件,像手机上的摄像头,感光传感器,重力传感器,陀螺仪等设备Android的API已经提供了对应的类库,而如果现在你的手机上现在新增了一个硬件但是Android API没有对应的类库给你用呢,这时候你就要使用JNI调用C代码,然后通过C控制硬件来实现了。别忘了java是运行在虚拟机上的,是无法直接的访问底层硬件的。
一个在Android上使用JNI的例子
准备工作:
1.配置你的NDK路径:Android studio中.
如果你没有NDK的话它会提示你下载。我当时就是从这里下载的。
②在你的app下面的build.gradle文件中的defaultConfig节点下加入↓
ndk { moduleName "MyJniLibName" abiFilters "armeabi", "armeabi-v7a", "x86" }
③在你的gradle.properties最后面加上:android.useDeprecatedNdk=true
编写代码
1.编写带有native声明的方法的java类(也就是上文所说的AndroidJniUtils.java,当然名字任意起),注意这里面不要有中文注释,不然在进行下一步的时候会错误: 编码GBK的不可映射字符
public class AndroidJniUtils { static { System.loadLibrary("MyJniLibName"); } public static native String getStringFromC();}
2.使用javah -jni 包名.类名生成扩展名为.h的头文件
//cd到你的项目的java路径下:
cd cd G:\svn1320160320\AndroidJNIDemo\app\src\main\java
//生成头文件
javah -jni com.miser.androidjnidemo.JniUseUtil
3.在你项目的…\app\src\main\jni\文件夹下,新建一个xxx.c的文件然后将你刚才生成的.h结尾的文件内容复制到这个文件中。
/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_miser_androidusejni_AndroidJniUtils */#ifndef _Included_com_miser_androidusejni_AndroidJniUtils#define _Included_com_miser_androidusejni_AndroidJniUtils#ifdef __cplusplusextern "C" {#endif/* * Class: com_miser_androidusejni_AndroidJniUtils * Method: getStringFromC * Signature: (II)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_miser_androidusejni_AndroidJniUtils_getStringFromC (JNIEnv *env, jclass jclass1, jint a, jint b) { return (*env)->NewStringUTF(env, "欢迎光临我的博客:" "\nhttp://blog.csdn.net/qq_27512671" );};#ifdef __cplusplus}#endif#endif
4.调用运行:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { TextView textView = (TextView) findViewById(R.id.text); textView.setText(AndroidJniUtils.getStringFromC()); } }); }}
在你的项目编译完成之后就会生成动态链接库.so文件,这些文件可以在…\AndroidUseJni\app\build\intermediates\ndk\debug\lib中找到
Demo地址:http://download.csdn.net/detail/qq_27512671/9498210
更多相关文章
- Android平台上最好的几款免费代码编辑器
- Android学习系列(5)--App布局初探之简单模型
- Android:“万能”Activity重构篇
- android Activity状态以及生命周期
- android程序自动化生成apk的过程
- Android应用程序的编译流程及使用Ant编译项目的攻略
- 仿微信、短信、QQ等消息数目右上角红色小圆球气泡显示(基于Androi
- android setVisibility(GONE)不及时刷新的问题
- android apk 加固