Android studio简单使用Jni

目录

android android studio Jni java调用C

步骤

  • 新建项目 SampleJni , 创建 AppSecret
  • 创建 jni 目录,命令行生成 AppSecret jni头文件,并拷贝到 jni目录
  • 新建 AppSecret头文件的,实现文件
  • 配置项目 build.gradle , 添加ndk配置

具体步骤

第一步:

新建项目 SampleJni

创建 AppSecret

代码如下:

/**
 * 获取秘钥
 *
 * Created by wangj on 15/5/16.
 */
public class AppSecret {

    public static AppSecret instance = new AppSecret();

    public static synchronized AppSecret getInstance() {
        return instance;
    }

    public native String getAppKey();

    static {
        System.loadLibrary("appSecretKey");
    }
}

第二步:

创建 jni 目录, 选择主项目 右键,依次选中 JNI Folderr

点击 JNI Folder打开下面的

默认即可,不需要勾选Change Folder Location,如果勾选,后面需做一些gradle配置。这里我们就先不选,默认即可。

点击 Finish, 将会在main下生成 jni 目录 下面我们要通过命令行生成 AppSecret 头文件,在此先build一下项目,在主项目 build 文件夹下

在控制台 Terminal中通过 cd 命令找到 intermediates->classes ->debug 目录下执行:

javah -jni com.wangj.samplejni.AppSecret

将生成的头文件 剪切拷贝到 jni 目录下

步骤三:

创建 hello_jni 实现头文件方法 com_wangj_samplejni_AppSecret.h 代码

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_wangj_samplejni_AppSecret */

#ifndef _Included_com_wangj_samplejni_AppSecret
#define _Included_com_wangj_samplejni_AppSecret
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_wangj_samplejni_AppSecret
 * Method:    getAppKey
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_wangj_samplejni_AppSecret_getAppKey
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

hello_jni.c 代码, hello_jni.c 名字是任意取的,重要的是里面的方法实现

#include "com_wangj_samplejni_AppSecret.h"

JNIEXPORT jstring JNICALL Java_com_wangj_samplejni_AppSecret_getAppKey
        (JNIEnv *env, jobject obj) {

    return (*env) ->NewStringUTF(env, "哈哈 我是从Jni中获取的秘钥");
}

第四步:

配置项目,加入ndk配置 打开主项目 build.gradle 代码

    ...
   
    defaultConfig {
        applicationId "com.wangj.samplejni"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        ndk{
            moduleName 'appSecretKey'
            ...  // 可选
        }
    }
    ...

注意: moduleName要与AppSecret类中

System.loadLibrary("moduleName");

对应上

End: 运行效果