天天看点

Android NDK笔记1-NDK配置,你的第一个JNI

总结下Android studio配置NDK的过程,实现你的第一个jni(Java native interface).

下载NDK

1.官方下载地址:https://developer.android.google.cn/ndk/downloads/index.html

2.民间下载地址:http://www.androiddevtools.cn/

选择与自己电脑相匹配包,下载到本地,解压。

配置到android studio中

打开android studio,新建android项目,打开File->Project Structure:

![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/3379d58c3811eb779cb56e3777dc768d.png)

选择刚才下载的NDK解压的路径:

![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/31cbe212c516fd2bb87d49882aef0965.png)

这时候在项目的local.properties文件会出现NDK的配置:

![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/e10439488cf2b5f1f511572ae13fdc1a.png)

还要在gradle.properties里面加上android.useDeprecatedNdk=true:

Android NDK笔记1-NDK配置,你的第一个JNI

新建NativeTest.java

public class NativeTest {
    static {
        System.loadLibrary("Hello");
    }
    public static native String getString();
}



           

产生.h头文

1.编译项目生成NativeTest .class

编译项目后.class文在项目的如下路径: ``` D:\google\decompilation\workspace\ForceApkObj\app\build\intermediates\classes\debug ``` ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/6d112ebb2a3ae23b2f6fb49319c09cd8.png)```

2.利用javah命令产生.h头文件

打开Android studio的Terminal终端,进入项目的app/src/main目录:

![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/516ecfc8c9af7f02073ad4ff61a3fb89.png):

使用命令javah生成h文件:

javah -d jni -classpath D:\google\decompilation\workspace\ForceApkObj\app\build\intermediates\classes\debug com.biyou.forceapkobj.NativeTest
           

注:

 1.javah是命令

 2.-d jni :在Terminal终端命令行所以的目录(这时候是app/src/main)新建一个名为jni的文件夹。

 3.-classpath D:\google\decompilation\workspace\ForceApkObj\app\build\intermediates\classes\debug: 项目所有类文件生成的目录

 4.com.biyou.forceapkobj.NativeTest:类名

然后在main目录底下会生成一个jni文件夹,里面会有一个com_biyou_forceapkobj_NativeTest.h文件

Android NDK笔记1-NDK配置,你的第一个JNI

新建.c文件

![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/0c7ee97443bdd96d1b17e4edc4cc80ee.png)

编写c代码:

#include <com_biyou_forceapkobj_NativeTest.h>

//返回一个字符串
JNIEXPORT jstring JNICALL Java_com_biyou_forceapkobj_NativeTest_getString
        (JNIEnv *env, jclass jobj) {

    return (*env)->NewStringUTF(env,"Hello World");
}
           

配置buid.gradle

defaultConfig {
        .....
        ndk {
            moduleName "Hello"//指定生成的so文件名
            abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的类型
        }
    }
           

注意:这里的moduleName要与NativeTest.java里面的System

.loadLibrary(“xxx”)一致。

调jni的getString()方法

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView content = new TextView(this);
        content.setText(NativeTest.getString());
        setContentView(content);
    }
}