Android Studio 生成so库 第一篇 配置NDK

2019-08-08  本文已影响0人  大川的川

Android Studio 生成so库 第二篇
Android Studio 生成so库 第三篇

  • Android studio中配置NDK环境

---------------- Android studio中安装NDK----------------

下载NDK

如果在这个过程中,你发现SDK Tools中根本没有NDK的选项,那么我们这样操作,即可!如图:

到这里,你的NDK环境就差不多了,

  • Android studio中创建一个工程

1.---------------- 新建一个JniTest类,增加native方法----------------

public class JniTest {
    // 加载demoCPP名称的 so库
    static {
        System.loadLibrary("demoCPP");
    }
    public native String getStringFromNative(String str);
}

2.---------------- 打开Terminal----------------


3.---------------- 右键 选中Java目录 按住不放 拖到Terminal----------------

4.----------------通过Terminal输入命令生成头文件(.h文件),生成对应头文件名称:包名+类名----------------
//javah -jni 包名+类名
javah -jni com.test.testjni.JniTest

如果这个时候你发现javah不是内部方法,那么肯定是你的Jdk环境配置的有问题,先去配置环境,再继续搞

5.----------------在与java同级 创建jni文件夹----------------


6.----------------jni文件夹中创建C++文件.cpp,将刚刚生成的.h文件内容拷贝到.cpp文件中并实现----------------
#include <jni.h>
#ifndef _Included_com_test_testjni_JniTest
#define _Included_com_test_testjni_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_testjni_JniTest
 * Method:    getStringFromNative
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 * 具体实现,接收传入的参数并且返回
 */
JNIEXPORT jstring JNICALL Java_com_test_testjni_JniTest_getStringFromNative
        (JNIEnv *env, jobject obj, jstring str) {
    const char *strAry = (env)->GetStringUTFChars(str, 0);
    return (env)->NewStringUTF(strAry);
}
#ifdef __cplusplus
}
#endif
#endif

7.----------------jni文件夹中创建Android.mk文件和Application.mk文件----------------
Android.mk NDK编译生成的动态库会有四个CPU平台:arm64-v8a、armeabi-v7a、x86、x86_64。
LOCAL_MODULE := demoCPP ----你想要的so库名称
LOCAL_SRC_FILES := demo.cpp ----上面刚刚创建的.cpp

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := demoCPP
LOCAL_SRC_FILES := demo.cpp
include $(BUILD_SHARED_LIBRARY)

Application.mk 会生成各个CPU平台下的动态库
APP_ABI := all ----生成的所有

APP_ABI := all

在app的build.gradle中配置

externalNativeBuild {
        ndkBuild {
            path "src/main/jni/Android.mk"
        }
    }

8.----------------执行clean project,然后执行Rebuild project 生成so库----------------


9.----------------代码中调用so库----------------
TextView tv=findViewById(R.id.txt001);
tv.setText(new JniTest().getStringFromNative("你好呀"));
上一篇 下一篇

猜你喜欢

热点阅读