Android studio开发jni

1、下载NDK

2、新建一个类,声明native方法。

这个类是java与c/c++交互的中介,方法由java声明,逻辑有C/C++实现。

public class MyJni{
    //加载so库
    static{
        System.loadLibrary("JniTest");
    }

    //native方法
     public static native String sayHello();
}

3、点击Android studio中的Build

Android studio开发jni_第1张图片
Paste_Image.png

点击Make Project等待编译。

3.1、打开终端,可以是dos或者是Android studio的Terminal切换到目录下,假设我的目录是:ndk----->build----->intermediates--->classes--->debug

Paste_Image.png

输入命令:javah -jni 包名路劲下的类文件

Paste_Image.png

4、点开Module(app)下的build--->intermediates--->classes-->debug下会看到一个.h的文件

5、在main文件夹下创建jni文件夹,把之前的.h文件拷贝到jni,在新建一个main.c文件,把.h的文件代码全部复制到main.c中。

1、生成的.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_example_binbin_testjni_myJNI */

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

#ifdef __cplusplus
}
#endif
#endif
2、拷贝修改后的main.c
/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_example_binbin_testjni_myJNI */

#ifndef _Included_com_example_binbin_testjni_myJNI
#define _Included_com_example_binbin_testjni_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_binbin_testjni_myJNI
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */

//就实现了个函数 JNIEnv的用法可以自行百度,这里就不展开了
JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello
        (JNIEnv *env, jclass jobj){

  //返回一句话
    return (*env)->NewStringUTF(env,"JNI hahahahahahahaha");

}

#ifdef __cplusplus
}
#endif
#endif

6、配置NDK的路径

打开工程下的local.properties文件添加NDK路径

Paste_Image.png

7、打开app Module的build.gradle文件,

在defaultConfig节点里添加代码。

ndk{
      moduleName "JniTest";
      ldLibs "log", "z", "m"
      abiFilters "armeabi", "armeabi-v7a", "x86"
}

注意:这里的moduleName是在之前编写的类里面加载的so库名。

8、在工程下的gradle.properties里加一句话:

android.useDeprecatedNdk = true

9、生成so库。

点击菜单栏上的Build,然后点击rebuild Project


Android studio开发jni_第2张图片
Paste_Image.png

然后在项目中的app\build\intermediates\ndk\debug\lib可以看到三个文件夹“armeabi”、“armerbi-v7a”、"x86"点开就是so库

Android studio开发jni_第3张图片
Paste_Image.png

10、配置so库

在src/main下新建文件夹jniLibs,生成so文件拷贝到改文件夹下。

Android studio开发jni_第4张图片
Paste_Image.png

11、使用jni

因为native方法声明成了静态方法,直接调用即可

protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);
    TextView test = new TextView(this);
    test.setText(MyJni.sayHello());
}

界面上就是显示在C文件中的内容了。

踩了挺多坑的,有时候生成的文件不对,有时候生成的文件名怪怪的,慢慢踩就好。注意:C和C++写的方式略有不同,C文件中(*env)->,而在C++中可以用evn->

鄙人不才,如有错误还望大神指点一二!!!!

你可能感兴趣的:(Android studio开发jni)