资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

android生成so,android生成so文件

android studio怎么生成.so文件

1、编译环境的搭建

目前创新互联公司已为上千余家的企业提供了网站建设、域名、网页空间、网站托管维护、企业网站设计、吴兴网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

正所谓:“工欲善其事必先利其器”嘛,所以先把改准备工具准备一下,因为是在studio下编译的,所以啊,什么studio、什么sdk、什么jdk,这些都自己去弄吧,这里说一下ndk这个编译C文件工具怎么下载安装;

下载完了之后直接是一个zip的压缩包,解压即可;

然后你会在local.properties文件中看到:

不要急,还没有完,ndk环境搭建还有最后一步,在gradle.properties的文件末尾加上android.useDeprecatedNdk=true这段代码:

好了,到此处环境就搭建完毕了。

2、java代码和C代码的编写步骤及过程

首先新建一个java类JNIUtils.java

public class JNIUtils {

static {

System.loadLibrary("huazict");

}

//java调C中的方法都需要用native声明且方法名必须和c的方法名一样

public native String getString();

}

然后如下图所示重新Make Project一下工程:

会在工程目录E:\work\MyApplication\stujni\build\intermediates\classes\debug\com\huazi\stujni\jni中看到自己编译后的class文件JNIUtils.class

其次就是生成.h文件了

在studio打开Terminal命令行工具,打开步骤是View-Tool Windows-Terminal

(或直接按Alt+F12

然后在命令行中先进入到工程的main目录下

输入命令:javah -d jni -classpath 自己编译后的class文件的绝对路径

例如:javah -d jni -classpath

E:\work\MyApplication\stujni\build\intermediates\classes\debug

com.huazi.stujni.jni.JNIUtils(注意debug后的空格)

看到上图,图中命令行中是直接进入到了工程的main目录下(在哪个目录下运行就会在哪个目录下自动生成jni文件夹),按回车之后就会在main目录下生成jni文件夹,同时生成.h文件,

这个文件.h文件不需要做任何修改,默认即可。

现在我们来写一个test的C文件huazict.c同.h文件一样放到jni文件夹下,代码如下:

#include "com_huazi_stujni_jni_JNIUtils.h"

/**

* 上边的引用标签一定是.h的文件名家后缀,方法名一定要和.h文件中的方法名称一样

*/

JNIEXPORT jstring JNICALL Java_com_huazi_stujni_jni_JNIUtils_getString

(JNIEnv *env, jobject obj) {

return (*env)-NewStringUTF(env, "这是我测试的jni");

}

最后在构建文件中的默认配置中加上:

//ndk编译生成.so文件

ndk {

moduleName "huazict" //生成的so名字

abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。

}

到这里,通过jni调C就完成了,现在我们来测试一下,写个TextView显示一下调用的C:

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView tv = (TextView)findViewById(R.id.tv);

tv.setText(new JNIUtils().getString());

}

}

ok,没问题,可以调用,其实也没有想象中的那么难,是吧!

三、调用编译过的.so库

上边编译完成了,有人会问:我要的是编译后的.so库,别人用的时候直接拿来用就可以了,那编译后的.so库在哪呢?

根据这个路径就可以找到指定输出的三种体系结构下的.so库文件,然后把.so文件复制出来,如下图所示的放到相应的文件夹下就ok了:

再次运行,结果还是一样的,跟上边贴的那张图的显示效果是是一样的,同样能调用到,代码我就不上传了,都在上边贴上去了,而且也上传不了,公司的所有文件都是加密的,想上传都上传不了。

到这里,整个jni的调用过程就结束了,包括调用jni需要的环境以及调用的过程,最后.so文件的导出,都在上边了,如果上边的jni调用过程有什么问题,欢迎留言,谢谢。

Android提取so文件并使用

参考

这篇文章中征程的apk:JniTest.apk把后缀改为JnitTest.zip,打开这个文件,在lib下面会有生成好的.so文件,copy出来。

可以发现这个.so文件叫libMyTest.so。

然后把这个so文件copy到新的项目的libs\armeabi下,使用和正常的.so文件一样。然后修改app的gradle中的android节点中加入:

然后在main\java 建立生成.so文件那个项目的包名, 把NdkJniUtils文件copy过来。当然封装成jar包更好啦。

到此完成,调用NdkJniUtils的方法即可获得.so文件中的内容。

如何获取android 系统的so库

android ndk调用第三方的so库文件的步骤如下:

1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;

2.第二种方案,创建自己的SO文件,在自己的SO文件里调用第三方SO,再在程序中调用自己的SO,这种比较复杂,需要建java类文件,生成.h文件,编写C源文件include之前生成的.h文件并实现相应方法,最后用android NDK开发包中的ndk-build脚本生成对应的.so共享库;

如何调用已有的SO文件来生成供Android使用的SO文件

你好,我现在能够用NDK的如下方式写几个简单的文件,然后打包为SO,再用另外的一个.C文件调用SO,然后生成最终的供Android使用的SO文件,具体方式如下:

下载一个从android模拟器里取system lib的工具busybox,然后调用命令

$adb push busybox /dev/sample/busybox

$adb shell chmod 777 /dev/sample/busybox

$adb shell ./dev/sample/busybox tar -cf /dev/sample/libs.tar /system/lib

$adb pull /dev/sample/libs.tar libs.tar

这样就将模拟器下的 /system/lib 目录的所有库(so)文件打包并下载下来了,解压libs.tar就得到了我们所需要的所有库文件。

接着将所有的文件copy 到 $(NDK)\build\prebuilt\windows\arm-eabi-4.2.1\lib\gcc\arm-eabi\4.2.1,这个时候基本的配置工作就结束了。

然后建立tutorial01.c调用tutorial02.c中的方法,通过写makefile文件将之打包为SO

CC = /cygdrive/e/android-ndk-1.5_r1/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-gcc

CFLAGS = -g -O2 -fPIC -DANDROID -I ./ -I ../ -I /cygdrive/e/android-ndk-1.5_r1/build/platforms/android-1.5/arch-arm/usr/include

SDFLAGS = -nostdlib -Wl,-T,armelf.xsc -Wl,-soname,$@ -Wl,-shared,-Bsymbolic -lc

CRT_OBJS= -lz -lm

# source files:

SRCS= tutorial01.c tutorial02.c tutorial02.h

all: libtutorial.so

libtutorial.so: tutorial01.o tutorial02.o

$(CC) $(SDFLAGS) -o $@ tutorial01.o tutorial02.o $(CRT_OBJS)

tutorial01.o: tutorial02.h

tutorial02.o: tutorial02.h

clean:

rm -f libtutorial.so *.o

然后make,这个时候会报错 can't find "armelf.xsc", 在ndk的目录里搜索一下,搜到之后copy 到$(NDK)\build\prebuilt\windows\arm-eabi-4.2.1\lib\gcc\arm-eabi\4.2.1,然后make,成功。

接着建立一个文件test01.c,动态加载so文件,然后写一个makefile文件,最后make成功。

建立一个Android工程 testapp来测试其运行情况,实验表明是能够正确运行的。

android studio 怎么生成so

配置NDK

下载ndk

解压配置环境变量

验证配置成功

设置android studio ndk路径

JNI开发

添加native接口注意写好native接口和System.loadLibrary()。

执行Build-Make Project,生成了.class文件,.class文件的生成路径是在 app/build/intermediates/classes/debug下

javah生成c头文件

点击”View-Tool Windows-Terminal“,打开终端,进入 \app\src\main的目录下执行javah命令:

javah -d jni -classpath SDK_android.jar;APP_classes class

然后就看到\app\src\main\jni\com_fy_administrator_jnitoso_JniUtil.h出现了.

1

然后根据.h文件,创建相对应的.cpp文件

创建Android.mk和Application.mk文件

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := JNIDemo

LOCAL_SRC_FILES := testJni.cpp

LOCAL_SRC_FILES += CAdd.cpp

include $(BUILD_SHARED_LIBRARY)

其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。

LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。

LOCAL_SRC_FILES是要编译的C/C++文件。

Application.mk

APP_ABI := all

#APP_ABI := armeabi armeabi-v7a x86 mips arm64-v8a mips64 x86_64

配置gradle

在defaultConfig下,配置ndk:

ndk {

moduleName "JNIDemo" // 生成的so名字

}

在android标签内配置sourceSets:

sourceSets {

main {

jniLibs.srcDirs = ['libs']

}

}

执行ndk-build命令生成所有cpu架构的so库


名称栏目:android生成so,android生成so文件
转载注明:http://www.cdkjz.cn/article/dsdpjjp.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220