首页 > 代码库 > 第一个Android studio JNI程序

第一个Android studio JNI程序

现在网上有很多实用JNI的教程,本文主要用于记录自己实现的方法和遇到的坑。

 

第一步,下载NDK.

     NDK可以去谷歌Android developer上下载。国内也有些中国版网站可以下载。

第二步,编写java类,这个类是java和c/c++交互的中介,定义一些native的方法,具体实现由c/c++完成。

package com.example.jni;

/**
 * Created by alexjie on 2017/5/14.
 */

public class JNIDemo {

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

    public static native String sayHello();
}

上部代码分两块,静态代码块用于加载我们后续要生成的c/c++实现的.so库,第二部分为定义的一个native的本地方法,此方法将由C++实现。

 

第三步,生成.h头文件

使用Android Studio的终端Terminal。

技术分享

进入到main目录下 F:\Andriod\workspaceAS\Demo\newclient\src\main>  ,使用命令生成.h头文件 javah -d jni -classpath ./java com.example.jni.JNIDemo 

-d jni 头文件生成到jni文件夹(当前在<Project>\app\src\main目录下,所以.h所在的目录为<Project>\app\src\main\jni )
-classpath ./java 指定去当前路径下java下寻找包名指定的类

然后就会在main文件夹下生成jni文件夹和com_example_jni_JNIDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_JNIDemo */

#ifndef _Included_com_example_jni_JNIDemo
#define _Included_com_example_jni_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jni_JNIDemo
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

 

第四步,实现main.cpp

.h头文件生成了,现在要实现C++的具体实现,新建一个C++文件:

技术分享

然后会生成一个main.cpp文件,将.h文件的内容拷入到main.cpp文件,并做具体实现:
//
// Created by alexjie on 2017/5/14.
//
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_JNIDemo */

#ifndef _Included_com_example_jni_JNIDemo
#define _Included_com_example_jni_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jni_JNIDemo
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello(JNIEnv *env, jobject jobj){
      //返回一句话
      return env->NewStringUTF((char *)"JNI hahahahahahahaha");
  };

#ifdef __cplusplus
}
#endif
#endif


第五步,配置NDK
打开Project的local.properties文件添加NDK路径

技术分享

打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk {
            moduleName "newclient"
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }

技术分享

 

在gradle.properties里面加上这么一句话:

android.useDeprecatedNdk=true

技术分享

 

第六步,生成.so库

rebuilt项目,在如下目录会生成.so库:app\build\intermediates\ndk\debug\lib

在main文件夹下,新建一个jnilib文件夹,将.so库考到其中。

技术分享

 

 现在在程序中就可以调用JNIDemo.sayHello()方法了。

 

 

问题:

1.build apk时,报错:installation failed with message failed to establish session

解决:关闭MIUI开发者选项中的MIUI优化并重启!

 

第一个Android studio JNI程序