当前位置: 首页 > 科技观察

AndroidStudio中的jni开发入门-看看我!

时间:2023-03-12 22:04:00 科技观察

本文记录AndroidStudio中jni开发的基本配置和入门教程。刚开始用eclipse配置ndk环境比较困难,现在基本都改成AS了。在此,需要帮助的新手村同学可以少走弯路?1.环境配置需要配置的主要是NDK(NativeDevelopmentKit)。现在Androidstudio非常方便,一键下载:文件→设置→根据截图找到如下路径→选择NDK→确认应用已下载安装,即可启动。2.jni你好世界!1.新建一个项目,新建一个app,测试jni开发2.设置对jni的支持,打开gradle.properties,添加:android.useDeprecatedNdk=true,打开local.properties,添加:ndk.dir=NDK路径,最后打开appbuild.gradle,在android/defaultConfig下添加ndk配置applyplugin:'com.android.application'android{compileSdkVersion25buildToolsVersion"25.0.0"defaultConfig{applicationId"com.lilei.testjni"minSdkVersion15targetSdkVersion25versionCode1versions.Runnertest"1.0"测试.runner.AndroidJUnitRunner"ndk{moduleName"JNISample"}}buildTypes{release{minifyEnabledfalseproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}}dependencies{compilefileTree(dir:'libs',include:['*.jar'])androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',{excludegroup:'com.android.support',module:'support-annotations'})compile'c??om.android.support:appcompat-v7:25.3.1'compile'c??om.android.support.constraint:constraint-layout:1.0.0-alpha8'testCompile'junit:junit:4.12'}moduleName表示编译后的so文件名3.新建java接口类访问c层新建Jni工具类,定义接口函数。function关键字使用native(static可以不用)packagecom.lilei.testjni;/***Createdbylileion2017/3/29.*/publicclassJniUtils{publicstaticnativeStringgetJniString();}getJniString()方法是与C层4.编译后生成头文件“make-project”,打开终端。运行成功后,打开app/build/intermediates/classes/debug/可以找到编译好的头文件“com_lilei_testjni_JniUtils.h”。不难发现,头文件名是由原始注册+类名cdapp/build/intermediates/classes/debug/javahcom.lilei.testjni.JniUtils5组成。创建jnidevelopment文件夹点击app文件夹,New→Folder→JNIFolder,在main文件夹下选择。生成成功后,主目录下会出现一个jni文件夹。找到刚才生成的头文件,复制到jni文件夹下(记得关闭刚才使用的终端,否则无法复制)头文件有了,现在在jni目录下新建一个C++文件,供开发使用,名字和头文件一样写C++文件中定义的函数的代码#include"com_lilei_testjni_JniUtils.h"JNIEXPORTjstringJNICALLJava_com_lilei_testjni_JniUtils_getJniString(JNIEnv*env,jclass){//新建一个字符串,返回HelloWorldreturnenv->NewStringUTF("HelloWorld");}6.java层加载所以返回JniUtils,添加static{System.loadLibrary("JNISample");}7.运行Run调用jni函数super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i("Jni",JniUtils.getJniString());}}至此jni的HelloWorld已经运行成功。如何运行一个C++程序,但实际开发大部分是打包编译so文件进行开发,类似于java中的jar包1.配置NDK环境变量,找到AndroidStudio中安装的NDK包的文件目录(E:AndroidStudioSDKSDKndk-bundle),添加到系统的环境变量中2.新建一个mk文件,在jni目录下新建Android.mkLOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=JNISampleLOCAL_SRC_FILES:=com_lilei_testjni_JniUtils.cppinclude$(BUILD_SHARED_LIBRARY)在jni目录下新建一个Application.mk文件APP_STL:=gnustl_staticAPP_CPPFLAGS:=-frtti-fexceptions-std=c++0xAPP_ABI:=armeabi-v7aAPP_PLATFORM:=android-183。编译生成so打开终端cd到jni目录下调用ndk-build开始编译,sondk-build正确运行,如图。运行成功后会在main文件夹下看到libs和obj文件夹,里面有各种CPU生成的so文件libs和obj。两者都有so文件,两者的区别google解释为:作为构建过程的一部分,libs文件夹中的文件已经去掉了符号和调试信息。因此,您需要为每个.so文件保留两份副本:一份来自libs文件夹以安装在Android设备上,另一份来自obj文件夹以供GDB安装以从中获取符号。也就是说libs目录下生成的库去掉了符号表和调试信息,obj下的库有调试信息。至此jni的开发入口就完成了