Android Studio NDK 开发

1、SDK Tools下载DNK,如果已经有下载有DNK的开发工具的话,可以直接导入
Android Studio NDK 开发_第1张图片
Android Studio NDK 开发_第2张图片

当然,AS后面推荐使用CMake方式开发NDK,这个后面再说,这里还是先讲ndk+javah+Android.mk的方式方式。

2、配置DNK的环境变量,这样才能在命令工具中方便使用DNK的命令,下面是我配置的环境变量

\SDK\platform-tools;D:\GitDir\Git\cmd;D:\android-ndk-r14b-windows-x86;C:\Program Files\Java\jdk1.8.0_73\bin

D:\AS_WorkSpace\MyJniDemo2\app\src\main\java>

3、工程的gradle.properties中添加android.deprecatedNdkCompileLease=1558488690642
Android Studio NDK 开发_第3张图片
我之前是添加的android.useDeprecatedNdk=true,会build报错,提示useDeprecatedNdk is no longer supported,表示不支持了。

4、app的gradle里面添加ndk相关的属性配置,这里是制定生成so的名称。
Android Studio NDK 开发_第4张图片
5、编写native方法:

   public static native String getStringFromJni();

    public static native String getStringFromJni(int i);

    public native void doSomeThings();

    public native void doSomeThings(String str);

6、在AS自带的命令输入工具中,执行javah命令生成相关的.h头文件。javah -d “目的文件” “源文件”

D:\AS_WorkSpace\MyJniDemo2\app\src\main\java>javah -d ../jni yys.com.myjnidemo.JniDataUtil

这里就是把java文件JniDataUtil.java 生成的头文件放在java同级目录下的jni文件夹中,生成的文件如下:
Android Studio NDK 开发_第5张图片
生成的方法名的命名规则:Java_包名_类名_方法名

7、建立c++源文件 .cpp文件,同时引用刚刚生成的.h头文件,并实现头文件里面声明的方法:
Android Studio NDK 开发_第6张图片
其中我们可以看到,还有一个Android.mk文件,这个文件是Android提供的一个makefile文件,来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库名

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := myjnidemo        动态库的名字
LOCAL_SRC_FILES := DateUtil.cpp  被编译的源文件

include $(BUILD_SHARED_LIBRARY)

同时,我们的.so库生成的位置在如下的地方:
Android Studio NDK 开发_第7张图片

8、引用.so动态库,并使用native方法

public class JniDataUtil {

    static {
        System.loadLibrary("jnidata");   引用动态库
    }

    public static native String getStringFromJni();

    public static native String getStringFromJni(int i);

    public native void doSomeThings();

    public native void doSomeThings(String str);

}
public class MainActivity extends AppCompatActivity {

    TextView textView ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.text1);
        textView.setText(JniDataUtil.getStringFromJni());
    }
}

至此,一个简单的ndk开发流程就完了。

你可能感兴趣的:(ndk)