android studio下JNI生成so文件

1.下载NDK文件
我下的android-ndk-r13b-windows-x86_64.zip,解压,配置环境变量
系统环境变量的配置
(图片网上截取的,仅供参考)

cmd下测试ndk是否按照成功,如果成功如下所示:

这里写图片描述
(图片网上截取的,仅供参考)

Android studio工具里ndk相关配置

这里写图片描述

ndk从此处下载ndk解压过程中总是出错,所以采用的是上面的方法,直接网上下载。如果使用CMake开发NDK,此处下载CMake和LLDB

CMake和传统JNI两种开发NDK的方法
这里写图片描述

apply点击下载,需要一会时间


2.开始写相关代码了………

先看工程结构(里面包含有生成的libs和obj文件夹,自己不需要创建),创建jni文件夹

这里写图片描述

public class MainActivity extends Activity {
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        MyJNI myJNI = new MyJNI();
        tv.setText(myJNI.sayHello());
    }
}

JNI类
添加native接口注意写好native接口和System.loadLibrary()

public class MyJNI {
    static {
        System.loadLibrary("JniTest");//库名和gradle里面一致
    }
    public static native String sayHello();
}

local.properties文件配置如下:

ndk.dir=D\:\\ndk\\android-ndk-r13b
sdk.dir=D\:\\sdk

gradle.properties文件里添加如下:

Android.useDeprecatedNdk=true

build.gradle文件里面如下

android {
    compileSdkVersion 23
    buildToolsVersion "25.0.0"
    defaultConfig {

        //添加
        ndk {
            moduleName "JniTest" //库名字
            //ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
    }

    //添加
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

注意:此时jni文件夹下是空的

AS –>Build–>Make Project,
在app\build\intermediates\classes\debug\com\example\t400\test文件夹下会生成相应的.class文件

这里写图片描述

javah生成.h文件
点击”View->Tool Windows->Terminal“,打开终端

xxxxx\app>cd build\intermediates\classes\debug

然后执行如下javah命令生成h文件

xxxxx\debug>javah -jni com.example.t400.test.MyJNI

执行完之后你可以在文件夹\app\build\intermediates\classes\debug下看见生成的 .h头文件为:

com.example.t400.test.MyJNI.h

其内容为:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_t400_test_MyJNI */

#ifndef _Included_com_example_t400_test_MyJNI
#define _Included_com_example_t400_test_MyJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_t400_test_MyJNI
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL java_com_example_t400_test_MyJNI_sayHello
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

将 .h文件剪切,粘贴到上面创建的空jni文件夹里,在jni目录下新建一个c文件,随意取名为jnitest.c ,然后编辑其代码如下:

#include "jni.h"
#include "com_example_t400_test_MyJNI.h"

JNIEXPORT jstring JNICALL Java_com_example_t400_test_MyJNI_sayHello
  (JNIEnv *env, jobject obj){
     return (*env)->NewStringUTF(env,"this is test data!");
  }

注:jnitest.c同目录下记得创建空的util.c文件,util.c文件是避免某bug忘记了,请搜索。


3.收尾工作
创建Android.mk和Application.mk文件

Android.mk在目录jni下,Android.mk文件如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := JniTest

LOCAL_SRC_FILES := jnitest.c
LOCAL_SRC_FILES += util.c

include $(BUILD_SHARED_LIBRARY)

其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。
LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。
LOCAL_SRC_FILES是要编译的C/C++文件。

Application.mk在最外层与local.properties同目级,Application.mk文件如下:

APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := JniTest

执行ndk-build命令生成所有cpu架构的so库

切换到jni目录执行
jni> ndk-build

如下:
这里写图片描述

看此刻的工程,图如下:
这里写图片描述

Android studio so 文件生成完毕!

注:上面的Make Project 也可以用Javac 命令把.class生成到相应的位置,然后在javah改路径


写在最后

so文件生成后的使用

在以上内容的基础上:
删除所有的 .mk 文件
删除所有的 .c 和 .h 文件
删除生成的obj文件夹和里面的所有文件
将生成的libs文件夹里的文件,拷贝到最外层的libs文件夹里,完成后删除该libs文件夹和里面的所有文件
至此一切OK!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值