android ndk开发编译生成so文件
2017-09-15 12:21
477 查看
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
2、生成.h头文件,新建一个class为NdkJniUtils,在内部声明native方法
然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:
然后接下来的步骤就是根据生成的class文件,利用javah生成对应的
.h头文件。
然后执行如下javah命令生成h文件。
执行完之后你可以在文件夹NDKApplication\app\build\intermediates\classes\debug下看见生成的 .h头文件为:
其内容为;
在工程的main目录下新建一个名字为jni的目录,然后将刚才的 .h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫jnitest.c 。然后编辑代码如下(后面会解释啥意思,这里重在工具使用):
c文件里面的方法跟.h头文件里面的方法相同
接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:
1
2
3
4
5
6
7
现在生成的so库名字也有了,那就去代码的NdkJniUtils java文件添加静态初始化load代码,添加如下:
在jni目录下面新建Android.mk文件
现在生成的so库名字也有了,那就去代码的NdkJniUtils java文件添加静态初始化load代码,添加如下:
2
3
好了,到此AS下NDK JNI开发的代码编写和设置就OK了,接下来就是编译工程运行就可以了。
在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了,接下来就是编译工程运行就可以了。
相关文章推荐
- android NDK开发使用Builder自动编译生成so文件
- [android ndk] -android studio中编译生成so文件
- Android NDK开发使用以及so文件生成和注意事项
- android jni开发,用javah生成***.h头文件,用ndk在libs下生成***.so文件
- eclipse里配置Android ndk环境,用eclipse编译.so文件
- android NDK编译(导入).a文件和编译多个so文件
- Android NDK开发之生成头文件
- 不使用Cygwin,在eclipse中快速开发JNI,一键生成C头文件.h,以及一键使用NDK交叉编译
- 不使用Cygwin,在eclipse中快速开发JNI,一键生成C头文件.h,以及一键使用NDK交叉编译
- windows下面编译protobuf,生成.a文件供android NDK使用
- Android NDK学习(4)使用cygwin生成.so库文件
- Android NDK学习(4)使用cygwin生成.so库文件
- NDK学习笔记<七> 使用AndroidStudio本身,编译C/C++文件生成SO文件
- Solaris编译Boost生成so文件出错:failed gcc.link.dll解决方法
- Android NDK 生成以及调用so 文件
- Android NDK同时编译多个so文件
- Android开发中如何将自己编译的.so文件用到其他的项目中
- Android开发-直播视讯(4)-Ubuntu编译ijkplayer的so文件-基础知识
- 小白Windows下编译使用Android NDK,调用SO文件
- Android 使用 FFmpeg (一)——编译生成.so文件