android ndk开发编译生成so文件

NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另外就是为了效率更加高些。如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ,然后需要编译生成,相当的蛋疼。要么是直接用Eclipse开发,但是前期配置也是一堆;真心蛋疼。但是现在在AS上Eclipse能做到的这边都OK,这边有的Eclipse上没有的,而且Google亲生的支持下只会越来越比Eclipse下开发NDK更加牛逼,所以你还不准备上手吗?


在Android studio里面可以自动下载ndk并集成

自动下载后默认在C盘,找到下载后的ndk路径,将路径(C:\Users\User\AppData\Local\Android\Sdk\ndk-bundle)添加到环境变量path里面,打开cmd命令输入ndk-build 输出一堆命令说明成功了。

1、打开as新建一个project

package com.example.user.ndktest1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView mTextView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) this.findViewById(R.id.test);

        NdkJniUtils jni = new NdkJniUtils();

        mTextView.setText(jni.getCLangu());
    }
    static {
        System.loadLibrary("NdkJniLibName");
    }
}
2、生成.h头文件, 新建一个class为NdkJniUtils,在内部声明native方法

public class NdkJniUtils {
    public native String getCLangu();
}
然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:

然后接下来的步骤就是根据生成的class文件,利用javah生成对应的 .h头文件。

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

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

xxxxx\debug> javah -jni io.github.yanbober.ndkapplication.NdkJniUtils

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

io_github_yanbober_ndkapplication_NdkJniUtils.h
其内容为;
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_user_ndktest1_NdkJniUtils */

#ifndef _Included_com_example_user_ndktest1_NdkJniUtils
#define _Included_com_example_user_ndktest1_NdkJniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_user_ndktest1_NdkJniUtils
 * Method:    getCLangu
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_user_ndktest1_NdkJniUtils_getCLangu
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
在工程的main目录下新建一个名字为jni的目录,然后将刚才的 .h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫jnitest.c 。然后编辑代码如下(后面会解释啥意思,这里重在工具使用):

#include "com_example_user_ndktest1_NdkJniUtils.h"
JNIEXPORT jstring JNICALL Java_com_example_user_ndktest1_NdkJniUtils_getCLangu
  (JNIEnv *env, jobject obj){
     return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");
  }

c文件里面的方法跟.h头文件里面的方法相同

接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:

defaultConfig {
    ......
    
ndk{
    moduleName "NdkJniLibName"         //生成的so名字
    abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。目前可有可无。
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

现在生成的so库名字也有了,那就去代码的NdkJniUtils java文件添加静态初始化load代码,添加如下:

在jni目录下面新建Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NdkJniLibName //so库的名字
LOCAL_SRC_FILES := jnitest.c  //要编译的c文件  项目里面要去掉注释
include $(BUILD_SHARED_LIBRARY)

现在生成的so库名字也有了,那就去代码的NdkJniUtils java文件添加静态初始化load代码,添加如下:

static {
        System.loadLibrary("NdkJniLibName");   //defaultConfig.ndk.moduleName
    }
  
  
  • 1
  • 2
  • 3

好了,到此AS下NDK JNI开发的代码编写和设置就OK了,接下来就是编译工程运行就可以了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值