当前位置:首页 » 编程软件 » androidstudio编译jni

androidstudio编译jni

发布时间: 2023-01-11 14:19:29

Ⅰ AndroidStudio如何配置NDK/JNIAndroidStudio怎么调用so动态链接库

AndroidStudio怎么调用so动态链接库?在我们日常开发中,经常会用到一些复杂的加密算法以保证通信的安全。通常这些算法会用C或C++实现后打包成.so动态链接库并向java层开发接口方便调用。


以AndroidStudio为例

1 . 首先去下载NDK包,下载路径如下可根据自己系统定点下载

https://developer.android.google.cn/ndk/downloads/index.html

static{
System.loadLibrary("jnitext");
}
publicnativeStringget_1111CLang_1String();

Ⅱ android studio JNI开发时 编译成功 但是没有生成.so文件 什么原因

(1)老版本,方法如下:taskNativeLibs(type:Copy){from(newFile(project(':MyProject').buildDir,'native-libs')){include'**/*.so'}intonewFile(buildDir,'native-libs')}tasks.withType(Compile){compileTask->compileTask.dependsOnNativeLibs}clean.dependsOn'cleanCopyNativeLibs'tasks.withType(com.android.build.gradle.PackageApplicationTask){pkgTask->pkgTask.jniDirnewFile(buildDir,'native-libs')}(2)新版本三种方法:(2.1)打包前先生成.Jar文件后自动解包到apk文件tasknativeLibsToJar(type:Zip,description:''){destinationDirfile("$buildDir/native-libs")baseName'native-libs'extension'jar'fromfileTree(dir:'libs',include:'**/*.so')into'lib/'}tasks.withType(Compile){compileTask->compileTask.dependsOn(nativeLibsToJar)}下面一句话就是打包生成目录(build\native-libs)中的.jar文件compilefileTree(dir:"$buildDir/native-libs",include:'native-libs.jar')(2.2)手动生成.Jar文件后自动解包到apk文件这个方式需要自己手动进行.SO文件压缩,具体步骤为:将所有需要使用的.so文件压缩为.zip文件(zip中的文件目录结构为:lib/armeabi/*.so)然后把zip文件后缀改为.Jar然后放到libs生成apk就ok默认就是自动打包所有.Jar文件:dependencies{compilefileTree(dir:'libs',include:'*.jar')}(2.3)这也就是现在正在使用的方式(推荐),其实无非就是把.SO文件打包到APK的lib文件夹中,假如仔细阅读了Gradle的使用方法,自然就知道其实Gradle官方在新版已经自动实现了打包.SO文件的.很简单级就是在配置的android节点下加入下面的内容就ok:sourceSets{main{jniLibs.srcDirs=['libs']}}其他地方无需修改,整个项目的配置文件如下:applyplugin:'android'android{"19.0.0"defaultConfig{"1.0"}buildTypes{release{('proguard-android.txt'),'proguard-rules.txt'}}sourceSets{main{jniLibs.srcDirs=['libs']}}}dependencies{compilefileTree(dir:'libs',include:['*.jar'])}

Ⅲ android studio JNI开发时 编译成功 但是没有生成.so文件 什么原因

1
在交叉编译的时候怎么都无法生成so文件,javah生成头文件没错,c文件也没错,java文件也没错,
2.原因:是JNI文件夹路径不对
3
在执行javah命令时,我进入的是cd
app/src/main/java
这样jni文件夹在java文件夹下,作为一个包存在,这样就无法生成so文件
执行javah的正确姿势:
4
进入app/src/main目录:cd
app/src/main
执行javah命令:javah
javah
-d
jni
-classpath
./Java
lab.sodino.jnitest.MainActivity
5,
-d
jni
头文件生成到jni文件夹(当前在<Project>\app\src\main目录下,所以.h所在的目录为<Project>\app\src\main\jni

-classpath
./java
指定去当前路径下java下寻找包名指定的类
这样再rebuild一下,就会生成so文件了

Ⅳ 如何在android studio中用JNI调用静态库

这里介绍通过Android.mk来编译c++生成静态库(也就是.a文件),并使用,上篇介绍了android studio快速入门之NDK之Android.mk编译

Ⅳ 如何在Android Studio中导入JNI生成的.so库

相信很多朋友在使用Android studio开发中,遇到过如何引入第三方so文件的问题,然而第三方官方仅仅给出了ADT环境下的集成方式。

Android studio中默认使用的是gradle编译方式,与ADT编辑方式不一样,那么so文件应当如何引入呢?

其实很简单。这里以集成JPUSH为例,看一下so文件如何引入到编译环境,最终到JNI直接可以调用该so文件。

首先,在我们的Mole的根目录中建立libs目录,将jpush集成SDK中的so文件分别拷入,截图如下:

然后就是编写我们的build.gradle文件。

关于so文件引入的配置很简单,代码配置如下:

  • tasknativeLibsToJar(type:Zip,description:""){

  • destinationDirfile("$projectDir/libs")

  • baseName"Native_Libs2"

  • extension"jar"

  • fromfileTree(dir:"libs",include:"**/*.so")

  • into"lib"

  • }

  • tasks.withType(JavaCompile){

  • compileTask->compileTask.dependsOn(nativeLibsToJar)

  • }



  • 自定义一个任务,在其中指定项目所依赖的so文件的目录,这里用了**/*.so来写,为了省事,指定需要拷入的目录 into "lib",那么动态运行库就被拷入到lib目录中。

    完整的build.gradle文件如下:

  • applyplugin:'com.android.application'

  • android{

  • compileSdkVersion21

  • buildToolsVersion"21.1.0"

  • defaultConfig{

  • applicationId"com.wujay.footerballstar"

  • minSdkVersion8

  • targetSdkVersion21

  • versionCode1

  • versionName"1.0"

  • }

  • buildTypes{

  • release{

  • runProguardfalse

  • ('proguard-android.txt'),'proguard-rules.pro'

  • }

  • }

  • tasknativeLibsToJar(type:Zip,description:""){

  • destinationDirfile("$projectDir/libs")

  • baseName"Native_Libs2"

  • extension"jar"

  • fromfileTree(dir:"libs",include:"**/*.so")

  • into"lib"

  • }

  • tasks.withType(JavaCompile){

  • compileTask->compileTask.dependsOn(nativeLibsToJar)

  • }

  • }

  • dependencies{

  • compilefileTree(dir:'libs',include:['*.jar'])

  • compile'com.android.support:appcompat-v7:21.0.0'

  • compilefiles('libs/jpush-sdk-release1.7.2.jar')

  • compilefiles('libs/umeng_sdk.jar')

  • compilefiles('libs/libammsdk.jar')

  • }

  • 基于有人在评论区提问,这里补充一下,有一个更为快捷轻快的配置方法

    那就是在build.gradle配置中,配置如下的信息:

  • sourceSets {

  • main { jniLibs.srcDirs = ['libs']

  • }

  • }

  • 你的so包可以放在lib目录下,跟jar包放在同样的目录,如lib/armeabi/libjpush172.so。

Ⅵ 如何在android studio中用JNI调用静态库

androidstudiondk调用过程如下:通过jniaes案例说明调用NDK层配置过程而我们通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。首先去官网下载一个最新的NDK,随便放到哪都行,像我放在D:\Dev\Android\android-ndk-r10d.(1)新建一个项目:名称JniAes首先在java类中添加native接口,注意写好native接口和System.loadLibrary()即可。代码如下:();();(Contextcontext);4然后buildproject得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:aes\app\build\intermediates\classes\debug\android\(2)接下来跟class文件生成相应的.h头文件,执行如下命令即可点击"View->ToolWindows->Terminal"即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件.javah-djni-classpathc:\Users\sodinochen\AppData\Local\Android\sdk\platforms\android-16\android.jar;..\..\build\intermediates\classes\debugcom.aes.jniaes.MainActivity(3)然后将刚才的.h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫strk.c。strk.c文件,用于实现核心代码逻辑,判断包名.哈希值是否合法,如果返回1,为合法。反之,则不合法。入口方法为:jintJava_com_aes_jniaes_MainActivity_jniCheckAPP(JNIEnv*env,jobjectcontext, jobjectthiz)接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:sdk.dir=D\:\\Dev\\Android\\android-sdk-windowsndk.dir=D\:\\Dev\\Android\\android-ndk-r10d(4)接下来在appmole目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:defaultConfig{ applicationId"com.aes.jniaes" minSdkVersion15 targetSdkVersion22 versionCode1 versionName"1.0" ndk{ moleName"checkapp-jni" //生成的so名字 abiFilters"armeabi","armeabi-v7a","x86" //输出指定三种abi体系结构下的so库。目前可有可无。 } }(5)最后就是添加静态初始化loadLibrary代码,添加如下:static{ System.loadLibrary("checkapp-jni"); //so文件的名字 }编译出来的so文件在aes\app\build\intermediates\ndk\debug\lib目录下 那么如何将编译好的so文件进行使用,可以通过如下方式:二. 引用so文件(1).在“src/main”目录中新建名为“jniLibs”的目录;(2).将so文件复制、粘贴到“jniLibs”目录内。

Ⅶ android studio2.3 怎么编译ffmpeg

整体调用逻辑为:
1 编译完ffmpeg库
2 使用jni方式撰写c代码,其中需要包含相应的ffmpeg的头文件
3 撰写相应的Android.mk文件,里面指定需要编译的c代码以及需要链接的动态库
4 执行ndk-build生成相应的jni库
5 创建andorid java程序,代码中loadLibrary相应ffmpeg库以及刚才生成的jni库
6 静态方法声明native函数,这些函数在jni写的c语言中都已经实现过

Ⅷ android studio 项目在添加jni后,调试很慢

一、前提条件

1、Android studio版本最好2.0以上,在1.5上试过各种问题

2、Ndk版本最好是android-ndk-r10d,ndk的路径要在项目根目录下的local.properties下指定,例如ndk.dir=F:\android-ndk-r10d

二、加入gradle-experimental插件

1、打开项目根目录下的build.gradle文件,加入

classpath "com.android.tools.build:gradle-experimental:0.7.0"

如下图:

2、默认使用的是com.android.application这个插件,如果要进行jni调试最好换掉这个插件,也就是使用之前加入的gradle-experimental插件,据说不换好像也行,但是没试过。下面贴出具体的配置:

[java]view plain

  • applyplugin:'com.android.model.application'

  • model{

  • android{

  • compileSdkVersion24

  • buildToolsVersion"24.0.2"

  • defaultConfig.with{

  • minSdkVersion.apiLevel=15

  • targetSdkVersion.apiLevel=24

  • applicationId"com.exampl.myapplication"

  • }

  • }

  • android.buildTypes{

  • release{

  • minifyEnabled=false

  • proguardFiles.add(file('proguard-rules.pro'))

  • }

  • }

  • android.ndk{

  • moleName="hello-jni"

  • ldLibs.addAll(["android","log"])

  • stl="gnustl_shared"

  • /*

  • *

  • *cppFlags.add("-fno-rtti")

  • *cppFlags.add("-fno-exceptions")

  • *ldLibs.addAll(["android","log"])

  • *stl="system"

  • */

  • }

  • android.proctFlavors{

  • create("arm"){

  • ndk.abiFilters.add("armeabi")

  • }

  • create("arm7"){

  • ndk.abiFilters.add("armeabi-v7a")

  • }

  • create("arm8"){

  • ndk.abiFilters.add("arm64-v8a")

  • }

  • create("x86"){

  • ndk.abiFilters.add("x86")

  • }

  • create("x86-64"){

  • ndk.abiFilters.add("x86_64")

  • }

  • create("mips"){

  • ndk.abiFilters.add("mips")

  • }

  • create("mips-64"){

  • ndk.abiFilters.add("mips64")

  • }

  • //Toincludeallcpuarchitectures,leavesabiFiltersempty

  • create("all")

  • }

  • }

  • dependencies{

  • compilefileTree(dir:'libs',include:['*.jar'])

  • testCompile'junit:junit:4.12'

  • compile'com.android.support:appcompat-v7:24.1.1'

  • compile'com.android.support:design:24.1.1'

  • }

Ⅸ 如何在android studio中用JNI调用静态库

NDK中 apps下本身就有一个例子,two-libs,就是引用静态库。
LOCAL_PATH:= $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)

LOCAL_MODULE := libtwolib-first
LOCAL_SRC_FILES := first.c

include $(BUILD_STATIC_LIBRARY)

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)

LOCAL_MODULE := libtwolib-second
LOCAL_SRC_FILES := second.c

LOCAL_STATIC_LIBRARIES := libtwolib-first

include $(BUILD_SHARED_LIBRARY)

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:593
制作脚本网站 发布:2025-10-20 08:17:34 浏览:888
python中的init方法 发布:2025-10-20 08:17:33 浏览:582
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:765
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:684
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1013
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:255
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:114
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:806
python股票数据获取 发布:2025-10-20 07:39:44 浏览:713