终于成功了55555555555
看了3篇文章才搞定,坑太多!!!!!!!
第一篇,配置ndk环境https://blog.csdn.net/u014651216/article/details/52410809
2.NDK安装与配置
- 首先创建一个Android项目工程,File-->New-->New Project,一路下一步就好,最后finish创建完成项目.
- 打开Project Structure,默认Android NDK location是没有的,这时候如果已经下载有了NDK,那你就可以直接选择下载好的NDK路径设置到输入框,否则点击download进行下载,下载完成后默认安装在sdk根目录,命名为ndk-bundle。 // 我的SDK地址为
D:\android-sdk
.
- 添加系统环境变量,新建变量名
ANDROID_NDK_HOME
,对应变量值为ndk根目录地址 ,如D:\android-sdk\ndk-bundle
,然后将ANDROID_NDK_HOME
添加到Path中去(%ANDROID_NDK_HOME%;)
,确定OK. - 至此,会在项目的
local.properties
文件下添加ndk的目录地址,如果没有自动添加,可以收到加上一行:ndk.dir=D\:\android-sdk\ndk-bundle
,由于ndk版本和IDE的版本可能存在不一致性,所以编译时会检查ndk的过时性,这个时候如果报警了,可以在gradle.properties
文件下添加一行:android.useDeprecatedNdk=true
.到此,NDK的安装和配置就完成.
第二篇https://blog.csdn.net/yanbober/article/details/45309049
在AS中新建一个Project,然后再新建一个class为NdkJniUtils,在内部声明native方法(jni使用的定义,后面系列教程会细说)。
package io.github.yanbober.ndkapplication;
public class NdkJniUtils {
public native String getCLanguageString();
}
在工程主文件Activity中写入如下代码调运JNI的东西显示在UI上。
public class MainActivity extends ActionBarActivity {
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.getCLanguageString());
}
}
然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:
NDKApplication\app\build\intermediates\classes\debug
然后接下来的步骤就是根据生成的class文件,利用javah生成对应的 .h头文件。
点开AS的Terminal标签,默认进入到该项目的app文件夹下。我在windows平台下输入如下命令跳转到class中间文件生成路径:
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 io_github_yanbober_ndkapplication_NdkJniUtils */
#ifndef _Included_io_github_yanbober_ndkapplication_NdkJniUtils
#define _Included_io_github_yanbober_ndkapplication_NdkJniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: io_github_yanbober_ndkapplication_NdkJniUtils
* Method: getCLanguageString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_io_github_yanbober_ndkapplication_NdkJniUtils_getCLanguageString
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
在工程的main目录下新建一个名字为jni的目录,然后将刚才的 .h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫jnitest.c 。然后编辑代码如下(后面会解释啥意思,这里重在工具使用):
#include "io_github_yanbober_ndkapplication_NdkJniUtils.h"
/*
* Class: io_github_yanbober_ndkapplication_NdkJniUtils
* Method: getCLanguageString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_io_github_yanbober_ndkapplication_NdkJniUtils_getCLanguageString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");
}
接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:
sdk.dir=D\:\\AndroidStdioSDK\\sdk
#add by 工匠若水
ndk.dir=D\:\\AndroidStdioSDK\\android-ndk-r10d-64bit
接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:
defaultConfig {
......
ndk{
moduleName "YanboberJniLibName" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。
}
}
现在生成的so库名字也有了,那就去代码的NdkJniUtils java文件添加静态初始化load代码,添加如下:
static {
System.loadLibrary("YanboberJniLibName"); //defaultConfig.ndk.moduleName
}
好了,到此AS下NDK JNI开发的代码编写和设置就OK了,接下来就是编译工程运行就可以了。
第三篇https://blog.csdn.net/xiaozhu0922/article/details/78835144(3.0前,上面两篇就可以了,3.0后还要加点东西)
先通过SDKManager下载:CMake和LLDB
在build.gradle的defaultConfig节点下加入:
// 使用Cmake工具
externalNativeBuild {
cmake {
cppFlags “serial_port”
//生成多个版本的so文件
abiFilters ‘arm64-v8a’, ‘armeabi-v7a’
}
}
在build.gradle的android节点下加入:
// 配置CMakeLists.txt路径
externalNativeBuild {
cmake {
path “CMakeLists.txt” //编译后so文件的名字
}
}
cmakelist文件如下
cmake_minimum_required(VERSION 3.4.1) add_library( cool SHARED src/main/jni/test.c) find_library( log-lib log ) target_link_libraries( cool ${log-lib} )所有流程都搞定,接下见证奇迹:
以上拼接的很不好,读者可能会有点被误导,但是凭借这3篇肯定可以弄出来。有啥bug直接留言。