知识点整理
- 1.安装ndk
- 2.android stuido ndk 配置
- 3.编写代码
- NDK常用编译参数
- 4.运行
开发环境:windows10 ,android studio 3.5.2 ,Android.mk方式
1.安装ndk
方式1: https://developer.android.google.cn/ndk/downloads/ 下载下来,解压后,进行环境配置
方式2:android studio 自带下载
进行环境变量配置:
2.android stuido ndk 配置
1.在local.properties 中配置ndk 路径
2.在gradle.properties 添加:
android.useDeprecateNdk=true
3.在main 同级目录下创建jni jniLibs 文件夹
3.编写代码
1.在com.example.Demo中创建myndk 这个类,通过在MainActivity 中点击button 来调用c/c++ 生成的so 库中的代码:
MainActivity.java:
package com.example.Demo;
import androidx.appcompat.app.AppCompatActivity;
import android.nfc.Tag;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.tx);
Log.d("main","onCreate");
}
public void onClick(View view) { //Buttton 点击会调用
myndk myndk = new myndk();
int x = myndk.getint();
Log.d("main","-----------------: "+x);
textView.setText(String.valueOf(x));
}
}
myndk.java
package com.example.Demo;
import android.util.Log;
public class myndk {
static {
Log.d("main","static static static static static static");
System.loadLibrary("MyLibrary");
}
public native int getint();
}
JNI分为静态加载和动态加载:
静态加载需要单独生成.h 文件
动态加载不需要手动生成.h 文件
这里先介绍静态加载方式和手动生成 .so 库方式
(1)两个文件编写完成后,在myndk.java 目录下执行:
javac myndk.java
生成myndk.class 文件。
(2)在main/java 目录下执行:
javah -classpath . -jni com.example.Demo.myndk
自动生成 com_example_Demo_myndk.h
然后将com_example_Demo_myndk.h 移动到java/jni目录下
(3) 然后在jni 目录下创建 Android.mk Application.mk test.c 文件。
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MyLibrary
LOCAL_SRC_FILES =: test.c
include $(BUILD_SHARED_LIBRARY)
Application.mk:
APP_MODULES := MyLibrary
APP_ABI := all
test.c:
#include "com_example_Demo_myndk.h"
JNIEXPORT jint JNICALL Java_com_example_Demo_myndk_getint
(JNIEnv * env, jobject obj){
return 500;
}
然后在jni 里面执行:
ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk NDK_LIBS_OUT=..\jniLibs\
会自动在jniLibs 里面生成不同平台的so 库
NDK常用编译参数
NDK_PROJECT_PATH
说明:指定工程目录
示例:ndkbuild NDK_PROJECT_PATH=C:\Hello
NDK_LIBS_OUT
说明:指定.so文件输出目录,默认值为"$(NDK_PROJECT_PATH)/libs"
示例:ndkbuild NDK_LIBS_OUT=C:\Hello\libs
NDK_APPLICATION_MK
说明:指定Application.mk文件路径,默认值为"$(NDK_PROJECT_PATH)/jni/Application.mk"
示例:ndkbuild NDK_APPLICATION_MK=C:\Hello\src\Application.mk
NDK_DEBUG
说明:打开或关闭调试模式,debug模式时会生成gdbserver等文件
示例:ndkbuild NDK_DEBUG=1
NDK_LOG
说明:显示内部NDK日志消息(用于调试NDK自身)
示例:ndkbuild NDK_LOG=1
NDK_HOST_32BIT
说明:Always use toolchain in 32-bit mode (see below).
示例:ndkbuild NDK_HOST_32BIT=1
APP_BUILD_SCRIPT
说明:指定Android.mk文件路径,默认值为"$(APP_PROJECT_PATH)/jni/Android.mk"
示例:ndkbuild APP_BUILD_SCRIPT=C:\Hello\src\Android.mk
Clear
说明:清除所有生成的二进制文件
示例:ndkbuild Clear
-B
说明:强制完全重新构建
示例:ndkbuild -B
-C <project>
说明:构建位于<工程目录>的工程的本地代码。当你不想在终端上用cd切换到那个目录时有用
示例:ndkbuild -C C:\Hello
V
说明:打开或关闭显示编译参数
示例:ndkbuild V=1
4.运行
效果:点击button 后,会调用native 方法,返回500 显示到textView上
以上是手动配置生成.so 库,最后在将.so 库加载进apk 里面。