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 <jni.h>
/* Header for class com_miser_androidusejni_AndroidJniUtils */

#ifndef _Included_com_miser_androidusejni_AndroidJniUtils
#define _Included_com_miser_androidusejni_AndroidJniUtils
#ifdef __cplusplus
extern "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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

痕迹丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值