美文网首页
关于Android的NDK开发的demo

关于Android的NDK开发的demo

作者: townof1997 | 来源:发表于2019-05-08 15:43 被阅读0次

俗语有云:
地转天旋,万事开头难。斗霜傲雪二十年,堂堂剑气尚寒。戎马倥偬一生,多少失败成功?试看大千世界,依旧海阔天空。
网上看了各种NDK开发的入门教程,要么编译不通过,要么就过时了,总之各种各样的问题;这里小编简单写一下NDK入门开发的demo,方便同学参考学习,如有不足之处还请多多指正。
1,开发环境AS3.0以上版本;cmakelists编译
2,在AS上新建一个Android Project(工程),不要勾选

create_NDK_pro.png

然后next,finish();
3,在main目录下新建cpp文件夹,在cpp文件夹下s新建.c文件或者.cpp文件。


cpp_file.png

内容如下:

#include <jni.h>

//JNIEXPORT jint JNICALL
//
//Java_com_town_dell_andk6_JNI_getInt//com.town.dell.andk6
//
//(JNIEnv *env, jobject jobj){
//
//    return 3;
//
//}
JNIEXPORT jstring JNICALL

Java_com_town_dell_andk6_JNI_getString//com.town.dell.andk6

        (JNIEnv *env, jobject jobj){

    return (*env)->NewStringUTF(env, "I am from C .");

}

4,将CMakeLists.txt文件复制到app目录下或者新建一个CMakeLists.txt,内容如下:

add_library(
jni_demo
SHARED
src/main/cpp/jni_demo.c )
find_library( # Sets the name of the path variable.
log-lib
log )
target_link_libraries( # Specifies the target library.
jni_demo
${log-lib} )

其中jni_demo是库文件名,是JNI类的System.loadLibrary("jni_demo");中的jni_demo;
5,然后在app.gradle文件里面的android的defaultConfig目录下配置:

externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }

在android下配置:

externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
如图: gradle_config.png

6,然后更新gradle,更新gradle之后,rebuild project,然后在build的目录下就会生成so文件。


build_so.png

7,然后在MainActivity里面测试如图:


ndk_test.png
至此NDK的Demo已完成;

8,记录如何在别的project中使用so文件

apply plugin: 'com.android.library'
    android {
        compileSdkVersion 26
        buildToolsVersion "26.0.1"
        defaultConfig {
           //    applicationId "com.demo.cmaketestdemo"
           minSdkVersion 19
            targetSdkVersion 26
           versionCode 1
           versionName "1.0"
          testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         externalNativeBuild {
             cmake {
                 cppFlags ""
                 }
           }
       }
    buildTypes {
          release {
              minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
             }
         }
          externalNativeBuild {
              cmake {
                  path "CMakeLists.txt"
              }
          }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
task makeJar(type: Copy) {
//删除存在的
delete 'build/libs/jni.jar'
//设置拷贝的文件
from('build/intermediates/bundles/default/')
//打进jar包后的文件目录
into('build/libs/')
//将classes.jar放入build/libs/目录下
//include ,exclude参数来设置过滤
//(我们只关心classes.jar这个文件)
include('classes.jar')
//重命名
rename ('classes.jar', 'jni.jar')
}
makeJar.dependsOn(build)

修改后sync gradle一下。然后打开右边的gradle命令栏。
找到other中的makeJar命令。鼠标左键双击。这个界面就弹出来了
在terminal窗口下输入gradlew makeJar

D:\AndroidStudio\CMakeTestDemo>

D:\AndroidStudio\CMakeTestDemo>gradlew makeJar

下面开始 在新的project中使用。

①在src目录下新建jniLibs文件夹,并将之前生成的so文件拷进去。
2,在app.gradle的Android{}里面配置gradle

sourceSets {

    main {

    jniLibs.srcDirs = ['src/jniLibs'];

    }

}

②将jni.jar赋值到libs目录下(libs是默认存在的)。
然后添加depend。
点击ok,然后就可以了。

相关文章

网友评论

      本文标题:关于Android的NDK开发的demo

      本文链接:https://www.haomeiwen.com/subject/nqamoqtx.html