什么是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

更多相关文章

  1. Android平台上最好的几款免费代码编辑器
  2. Android学习系列(5)--App布局初探之简单模型
  3. Android:“万能”Activity重构篇
  4. android Activity状态以及生命周期
  5. android程序自动化生成apk的过程
  6. Android应用程序的编译流程及使用Ant编译项目的攻略
  7. 仿微信、短信、QQ等消息数目右上角红色小圆球气泡显示(基于Androi
  8. android setVisibility(GONE)不及时刷新的问题
  9. android apk 加固

随机推荐

  1. Android studio 不能预览布局文件
  2. 第一个app项目
  3. android自定义menu,PopUpWindow弹出菜单
  4. eclipse 导入 android studio 问题汇总
  5. 通过Location获取Address的使用!
  6. Android基础 DatePicker和TimePicker的使
  7. Android的列表布局
  8. 屏幕切换,保存内容
  9. Android(java)学习笔记129:Tab标签的使用
  10. android 获取网络资源