linux下ndk-bulid编译形成了so文件,在windows环境下的eclipse怎么使用

linux下ndk-bulid编译形成了so文件,在windows环境下的eclipse怎么使用,第1张

可以直接在android工程下使用,因为android就是linux内核。

android的NDK开发需要在linux下进行: 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。

2.安装android-ndk开发包,这个开发包可以在google android : 通过这个开发包的工具才能将android jni 的C/C++的代码编译成库

3.android应用程序开发环境: 包括eclipse、java、 android sdk、 adt等。

NDK编译步骤:

选择 ndk 自带的例子 hello-jni ,位于E:\android-ndk-r5\samples\hello-jni( 根据具体的安装位置而定 ) 。

2.运行 cygwin ,输入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,进入到 E:\android-ndk-r5\samples\hello-jni 目录。

3.输入 $NDK/ndk-build ,执行成功后,它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。 ($NDK是调用我们之前配置好的环境变量, ndk-build 是调用 ndk 的编译程序 )

4.此时去 hello-jni 的 libs 目录下看有没有生成的 .so 文件,如果有,ndk 就运行正常啦。

你好,我现在能够用NDK的如下方式写几个简单的文件,然后打包为SO,再用另外的一个.C文件调用SO,然后生成最终的供Android使用的SO文件,具体方式如下:下载一个从android模拟器里取systemlib的工具busybox,然后调用命令$adbpushbusybox/dev/sample/busybox$adbshellchmod777/dev/sample/busybox$adbshell./dev/sample/busyboxtar-cf/dev/sample/libs.tar/system/lib$adbpull/dev/sample/libs.tarlibs.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文件将之打包为SOCC=/cygdrive/e/android-ndk-1.5_r1/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-gccCFLAGS=-g-O2-fPIC-DANDROID-I./-I../-I/cygdrive/e/android-ndk-1.5_r1/build/platforms/android-1.5/arch-arm/usr/includeSDFLAGS=-nostdlib-Wl,-T,armelf.xsc-Wl,-soname,$@-Wl,-shared,-Bsymbolic-lcCRT_OBJS=-lz-lm#sourcefiles:SRCS=tutorial01.ctutorial02.ctutorial02.hall:libtutorial.solibtutorial.so:tutorial01.otutorial02.o$(CC)$(SDFLAGS)-o$@tutorial01.otutorial02.o$(CRT_OBJS)tutorial01.o:tutorial02.htutorial02.o:tutorial02.hclean:rm-flibtutorial.so*.o然后make,这个时候会报错can'tfind"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来测试其运行情况,实验表明是能够正确运行的。

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调用过程有什么问题,欢迎留言,谢谢。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8006203.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存