android studio jni开发 简书,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

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

Paste_Image.png

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

Paste_Image.png

10、配置so库

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

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开发,简书)