ADeveloperH Blog

Meet a better self !

Android 周边技术分享


JNI开发(一)

参考资料

Android Studio中NDK开发傻瓜教程(JNI)

Android JNI NDK C++ so本地验证 获取应用签名

通过JNI实现验证App签名获取公钥

Android下玩JNI的新老三种姿势

System.load 和 System.loadLibrary详解

1 配置环境

首先需要下载ndk,在AndroidStudio中如下图

ndk下载

然后在项目中配置ndk的路径,如下图:

配置ndk路径

2 使用步骤

2.1 修改项目下gradle.properties文件

添加如下命令:

android.useDeprecatedNdk=true

2.1 配置app下的build.gradle

defaultConfig下增加ndk配置:

defaultConfig {
        applicationId "com.mobile.androidtest"
        minSdkVersion 11
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        
        ndk{
            //生成.so的文件名称
            moduleName "hellojnilib"
            abiFilters "armeabi"
        }
    }

2.1 创建调用native方法的java类

package com.mobile.androidtest;

/**
 * @author huangjian
 * @create 2018/7/17 0017
 * @Description
 */
public class JNIUtil {

    static {
        //装载JNI库文件,也可以在使用的地方进行装载
        //必须与app下的build.gradle中moduleName相同
        System.loadLibrary("hellojnilib");
    }

    public static native String getNativeStr();
}

使用AndroidStudio中Build->Make Project 进行编译生成class文件,如下图:

编译生成class文件

编译后的class文件

命令行进入app->build->intermediates->classes->debug 目录(AndroidStudio下可以直接将debug拉入命令行就会直接进入该目录)
使用javah -jni com.mobile.androidtest.JNIUtil命令生成com_mobile_androidtest_JNIUtil.h文件,命令的格式是javah -jni 包名.包含native方法的类

如下图

命令行生成.h文件

创建jni文件目录,具体步骤如下图:

创建jni目录

创建jni目录2

将生成的com_mobile_androidtest_JNIUtil.h文件copy到jni目录下,在jni目录中新建c source文件hellojni.cpp(名字可以取任意的),内容如下:

//
// Created by Administrator on 2018/7/17 0017.
//
#include "com_mobile_androidtest_JNIUtil.h"
JNIEXPORT jstring JNICALL Java_com_mobile_androidtest_JNIUtil_getNativeStr(JNIEnv *env, jclass thiz){
    return (env)->NewStringUTF("Hello JNI");
}

方法名剪切自com_mobile_androidtest_JNIUtil.h,注意需要加上入参名称和返回值,如下图:

创建c文件

创建c文件2

再次使用使用AndroidStudio中Build->Make Project 进行编译,会生成.so的动态链接库,生成后的目录如下:

编译后.so目录

把该lib下的所有为文件拷贝到,app下的libs中,然后在Activity中调用,如下:

package com.mobile.androidtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toast.makeText(this, JNIUtil.getNativeStr(), Toast.LENGTH_LONG).show();
    }
}

编译后.so目录

完整的Demo代码

最近的文章

JNI开发之CMake实现(二)

参考资料向您的项目添加 C 和 C++ 代码(官网)在 Android Studio 2.2 中愉快地使用 C/C++Android Studio中NDK开发傻瓜教程(JNI)Android Studio中NDK开发傻瓜教程(JNI)环境配置 要在 Android Studio 中使用 CMake 或者 ndk-build,你需要使用 Android Studio 2.2 或更高的版本,同时需要配合使用 Android Plugin for Gradle 2.2.0 及以上的版本。 下...…

继续阅读
更早的文章

Home键后重启仍然启动SplashActivity问题

1 问题描述首次安装APP后从SplashActivity页面进入MainActivity(进入时SplashActivity已经finish),然后按home键,再点击图标打开APP的时候发现APP重新从SplashActivity进入MainActivity,并不是跳转到点击home键之前的MainActivity页面。这个问题只会在安装成功后出现,安装后杀掉进程,再次重复操作没有问题。(部分手机通过adb安装没有问题,但是直接安装apk后首次进入都会出现上述问题)2 问题原因参考资料...…

继续阅读