博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Studio开发JNIproject
阅读量:6192 次
发布时间:2019-06-21

本文共 4486 字,大约阅读时间需要 14 分钟。

使用Android Sutdio创建一个新的project后,接下来记录创建NDKproject的基本步骤。
本文将达到:
1. 创建NDKproject
2. 在JNI中输出Log语句
3. 指定编译的so库的abi版本号
4. 解决在创建NDKproject中的问题
Step: 1. 加入native接口
注意写好native接口和System.loadLibrary()就可以了。并无特别之处。
P.S:onCreate()中对R.id.txt运行setText()。所以这里须要对xml布局文件按正常的开发步骤进行改动就可以。
直接给出代码例如以下:
public class MainActivity extends Activity{    static {        System.loadLibrary("JniTest");    }       public native String getStringFromNative();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView txtView = (TextView) findViewById(R.id.txt);        txtView.setText(getStringFromNative());    }}

Step: 2.运行Build->Make Project

这一步骤运行一下,验证project中并无其他错误,并对project进行了编译,生成了.class文件.
.class文件的生成路径是在 app_path/build/intermediates/classes/debug下的.例如以下图:

Step: 3.javah生成c头文件

点击"View->Tool Windows->Terminal",即在Studio中进行终端命令行工具.运行例如以下命令生成c语言头文件。
这里须要注意的是要进入 <Project>\app\src\main的文件夹下运行javah命令,为的是生成的 .h 文件相同是在<Project>\app\src\main路径下,能够在Studio的project结构中直接看到。

操作命令:
javah -d jni -classpath <SDK_android.jar>;<APP_classes> lab.sodino.jnitest.MainActivity
详细操作图例如以下:

javah -d jni -classpath c:\Users\sodinochen\AppData\Local\Android\sdk\platforms\android-16\android.jar;..\..\build\intermediates\classes\debug lab.sodino.jnitest.MainActivity


对于"主版本号51比50新,此编译器支持最新的主版本号"则是因为电脑上安装了两个版本号的jdk引起的,而当前使用的是旧的jdk。
把旧的jdk删除。并运行java version命令后显示当前jdk为最新的1.7时,则不会再有此提示了。例如以下图:

最后的生成结果:

Step: 4.编辑c文件

在main.c文件里实现头文件里的方法,详细功能为直接return回一个String。而且使用android_log打印出相关日志。

代码例如以下:
/* DO NOT EDIT THIS FILE - it is machine generated */#include 
#include
#ifndef LOG_TAG#define LOG_TAG "ANDROID_LAB"#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)#endif/* Header for class lab_sodino_jnitest_MainActivity */#ifndef _Included_lab_sodino_jnitest_MainActivity#define _Included_lab_sodino_jnitest_MainActivity#ifdef __cplusplusextern "C" {#endif/* * Class: lab_sodino_jnitest_MainActivity * Method: getStringFromNative * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_lab_sodino_jnitest_MainActivity_getStringFromNative (JNIEnv * env, jobject jObj){ LOGE("log string from ndk."); return (*env)->NewStringUTF(env,"Hello From JNI!"); }#ifdef __cplusplus}#endif#endif
到这里后。我们再运行一个"Build->Make Project"。发现"Messages Gradle Build"会给出提演示样例如以下:
Error:Execution failed for task ':app:compileDebugNdk'. > NDK not configured. Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties. (On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)
这里提示了NDK未配置,而且须要在project中的local.properties文件里配置NDK路径。

好了,提示非常清楚了。那我们就进入下一步吧。

Step: 5.配置NDK
这一步包含两个动作:
1.指明ndk路径
2. 改动build.gradle配置
    project中共同拥有两个build.gradle配置文件。我们要改动的是在<Project>\app\build.gradle这个文件。为其在defaultConfig分支中添加上
ndk {        moduleName "JniTest"        ldLibs "log", "z", "m"        abiFilters "armeabi", "armeabi-v7a", "x86"    }
    以上配置代码指定的so库名称为JniTest,链接时使用到的库。相应android.mk文件里的LOCAL_LDLIBS。及终于输出指定三种abi体系结构下的so库。
加入后例如以下图:
这时,再运行"Build->Rebuild Project",就能够编译出so文件了。
但在Window平台上会出现一个问题:
Error:Execution failed for task ':app:compileDebugNdk'.> com.android.ide.common.internal.LoggedErrorException: Failed to run command: D:\Mission\adt-bundle-windows\ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-21 NDK_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi,armeabi-v7a,x86Error Code: 2Output: make.exe: *** No rule to make target `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni', needed by `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni\main.o'. Stop.
出现这个错误非常莫名其妙..几番折腾下,找到一个视频出来了大概原因及解决方案:
出处见Youtube视频 02:50分開始:

在Windows下NDK一个bug,当只编译一个文件时出现会出现此问题,解决方法就是
再往jni文件夹加入一个空util.c文件就可以。例如以下图:
编译出来的库文件被Studio输出到了下图的路径中

Step: 6.安装运行

界面:

查看Log打印:

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5371507.html,如需转载请自行联系原作者 

你可能感兴趣的文章
无限游戏里没有观众
查看>>
TTK-企业级产品快速开发框架(前端+后端)
查看>>
Javascript中的原型继承的实现
查看>>
leetcode 18 4Sum
查看>>
iOS逆向(9)-Cycript,动态分析APP利器
查看>>
那么多影楼在偷偷开发小程序?小程序能给影楼行业带来什么?
查看>>
【Code-Snippet】自定义View
查看>>
学习资源收藏
查看>>
Chatopera精彩十一月!邀您免费使用智能客服,企业聊天机器人!
查看>>
FileProvider共享文件、缓存
查看>>
面试题
查看>>
Fluwx:微信SDK在Flutter上的实现
查看>>
《Elasticsearch技术解析与实战》Chapter 2.1 Elasticsearch索引增删改查
查看>>
摹客iDoc “柔性工作流”,让设计随需而动
查看>>
震惊!美国总统看到画中画功能都惊呆了!
查看>>
linux安装oh-my-zsh
查看>>
阿里云服务器1折团购,上手“开箱验货”
查看>>
HTML标签
查看>>
怎样才能学好web前端
查看>>
参加创业赛事活动能够获得哪些创业所需要的资源?
查看>>