编译jni
‘壹’ android studio怎么编译带so库的jni
安装android-ndk
将生成.so文件的源代码添加到android工程中的jni目录下(如果没有则新建)
在jni目录下编写编译文件(一个.mk文件,这个类似于linux的make文件,一句话解释不了,自己可以查一下)
然后打开cmd,cd进入你android工程目录下。然后输入“ndk-build"回车就会编译出.so文件。会根据不同的处理器生成四个.so文件
‘贰’ win7下编译jni过程 报错,报错内容为Permission denied make: ***
LZ你是用cywine编译的吗,是的话,不妨先获取root权限再执行编译命令
‘叁’ java jni 怎么在windows环境中编译成linux下的so文件
可以直接在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 自带的例子 hello-jni ,位于E:android-ndk-r5sampleshello-jni( 根据具体的安装位置而定 ) 。
2.运行 cygwin ,输入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,进入到 E:android-ndk-r5sampleshello-jni 目录。
3.输入 $NDK/ndk-build ,执行成功后,它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。 ($NDK是调用我们之前配置好的环境变量, ndk-build 是调用 ndk 的编译程序 )
4.此时去 hello-jni 的 libs 目录下看有没有生成的 .so 文件,如果有,ndk 就运行正常啦。
NDK编译步骤:
‘肆’ 如何在eclipse中用ndk编译jni
工具:
eclipse
步骤
1、右键要编译jni的工程,点击
2、简单使用NDK编译
3、点击new添加以个编译器
4、简单使用NDK编译
5、填好相关路径参数
6、简单使用NDK编译
7、勾选如下选项
8、简单使用NDK编译
9、勾选如下选项
10、简单使用NDK编译
11、点击右下角的按钮
12、简单使用NDK编译
13、选择要编译的工程
14、简单使用NDK编译
15、最后勾上新建的这个编译器
‘伍’ Android用NDK和整套源码下编译JNI的不同
2. 注册函数的方法是不同的。举例说,在com/evan129/jnitest/jniutils.java有个native int foo()方法,需要在jni中实现
在ndk中,只要实现这个函数,然后函数名是以jint java_com_evan129_jnitest_jniutils_foo(jnienv* env, jobject thiz) 命名既可。也就是说,如果jni只要实现这个函数,并且功能也很简单的话,那么jni c/cpp文件里只需要这一个函数就完事了。
但在android源码中编译jni代码是不同的,jni中的函数名无所谓。不过至少还需要加一个
jniexport jint jnicall jni_onload(javavm* vm, void* reserved)方法,这个方法可以找个现有的复制一把就行,检查运行环境的。然后主要是这个方法中会调用(*env).registernatives函数,在这里把jni中的方法和java文件中的方法关联起来。
3. 有个很诡异的区别,自动传入的jnienv* env好像不是一个东西。因为在android源码中使用这个env一般是如env->newstringutf(…),而ndk中sample里的一处是(*env)->newstringutf(…) 这env和*env差很大。但两处函数传入的都是jnienv* env,只能怀疑jnienv的定义是不是都是不同的。
‘陆’ eclipse会自动调用ndk-build编译jni吗
一、写好c代码后,然后用cygwin搭建ndk-build环境,用ndk-build来编译出相关的.so文件(libs目录)之后,
再用eclipse里去编译java程序,从而使用.so文件。该方法在上一篇搭建NDK环境有介绍。
二、利用eclipse完全可以达到编译.so的目的。
首先,先装上CDT吧,这是Eclipse的C/C++环境插件,装上它后你就可以在Eclipse里创建C/C++项目和代码文件了。插件的安装有两种方式,一种是在线安装,一种是下载安装包自己安装,这里只介绍第一种方式,另一种方式可自行网络。首先登录http://www.eclipse.org/cdt/downloads.php,找到对应你Eclipse版本的CDT插件的在线安装地址,如下图所示:,找到对应你Eclipse版本的CDT插件的在线安装地址,如下图所示:
2、找到对应你
eclipse版本的CDT插件地址,之后打开Eclipse,点Help菜单,找到Install New
Software菜单,注意一些老版本的Eclipse菜单不太一样,比如说Europa的版本,就是Help--Software
Updates—Find and Install--Search for new features to install--New Remote
Site,除了菜单不太一样外,安装方式都差不多,可自行网络一下,下图以Indigo版本为准:
3、把取的地址填进去,出来插件列表后,选Select All,如下图所示:
然后狂点下一步即可完成安装。
也可以点击Add按钮用离线方法安装。出现该对话框,点击Archive按钮,选择之前下载的离线安装包,安装过程同在线安装。
4、安装完成后,点菜单File-New-Project,出现新建项目界面,如果出现了C/C++项目,那么恭喜你,CDT安装也完成了,如下图所示:
5、
不过光有CDT还不行,CDT编译代码还是需要调用cygwin当中的编译工具进行,所以我们还需要手动配置C/C++的编译器,还是以NDK自带的
hello-jni为例子,首先打开
Eclipse,File->New->Project->Android->Android
project->next,在New Android Project选项卡中,选Create project from existing
source;在Location:按Browse找到NDK自带的Hello-jni目录。
选择Android SDK版本后,点击Finish,完成导入。
6、 把这个项目导入进来,导入后如下图所示:
7、 编译C文件:
右键单击HelloJni之后,点击Properties,弹出配置界面,之后再点击Builders,如下图所示:
点击New按钮,新添加一个编译器,点击后出现添加界面,选择Program,点击OK:
8、 点击OK后,出现了添加界面:
在Main Tab界面, 填充以下内容:
Name:
编译器名称,随便填写。如:NDK_Builder
Location:
可执行工具的位置。即NDK安装目录下ndk-build.cmd的位置。
你可以点击Browser File System...按钮选择Android NDK安装目录下的ndk-build.cmd文件来指定Location。如下图:
你也可以设置一个变量来指定Android NDK的安装目录后设置Location。点击Variables按钮指定。如下图:
出现选择Variable的选择框。
单击Edit Variables...按钮。出现Variable管理的界面。单击New按钮添加Variable。
输入Variable的名称,如:ndk_home。然后单击Browse...按钮,选择Android NDK的安装目录后,单击OK。
至此,NDK的Variable设置完成。
然后,单击Main Tab界面上Location的Variables...按钮,选择刚才设置的ndk_home变量。如下图:
单击OK后,在Location的编辑框里会有选择的ndk-home变量,在其后面添加上/ndk-build.cmd,OK,Location设置完成。
如下图:
Working Directory:
要编译的C/C++程序的工作目录。一般指定到jni文件夹,因为所有的C/C++程序都在该文件夹内实现。
首先选择Working Directory里的Browse Workspace...按钮,如下图:
然后,选择要编译的项目HelloJni的jni文件夹。
9、 接着切换到Refresh选项卡,给Refresh resources upon completion打上钩,选择The Project containing the selected resource项,
表示只更新包含选中资源的项目,选中的资源项就是Main Tab选择的jni文件夹。
完成后如下图:
10、 最后切换到Build Options选项卡,勾选During auto builds,如下图所示:
Specify Resources 按钮单击后,选择HelloJni项目的 jni 文件夹。
11、单击 Apply OK 确认设置后,确保此 NDK 构建工具设置为列表中的第一个条目,方法是选择 Up 按钮,直到其位于 Builders 列表的顶部
记得一定要点Up按钮,把它排到第一位,否则C代码的编译晚于Java代码的编译,会造成你的C代码要编译两次才能看到最新的修改,排到第一位后如下图所示:
12、 现在再次恭喜你,编译配置也配置完成啦,那么来试试看是否可以自动编译吧,打开左侧jni目录里的hello-jni.c文件把提示Hello from JNI!改改,如下图所示:
单击项目,选择Build Project后,在HelloJni项目下会多出libs文件夹,.so文件就存放在这里。
另外在Console控制台会输出成功编译的提示信息。
编译之后点击run按钮跑起来看看吧,如果模拟器当中出现了你新修改的提示信息,那么再一次恭喜你,已经全部配置成功了!
‘柒’ android studio 编译jni 跟工程有关吗
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文件了
‘捌’ windows编译jni动态库 生成的文件在哪
执行编译操作:
编译通过后将在app\build\intermediates\classes\debug\cn\net\shuihan\myapplication目录下产生文件TestA.class
产生Jni头文件:
通过Alt +F12打开terminal窗口,在命令行输入cd app/src/main
‘玖’ android studio 怎么编译jni
一、使用已经编译好的so
这种情况比较件简单,只要把的.so文件放到相应的目录即可。如下:
.[mole_name]
. . [src]
. . .[main]
. . . .[jniLibs]
. . . . .[armeabi]
. . . . .[armeabi-v7a]
. . . . .[x86]
. . . . .[mips]
注意 jniLibs 目录是放在 mole 下面,在Android Studio中效果如下,这样编译之后so就会被自动打包进apk,代码中直接 loadLibrary即可了:
1 String libName = "helloNDK"; // 库名, 注意没有前缀lib和后缀.so
2 System.loadLibrary( libName );
二、使用C/C++源码
1 r9d以上版本NDK
首先确保自己的NDK版本在r9d以上,目前最新可以拿到的是r10,下载地址:
http://tools.android-studio.org/
感谢 Android Studio中文组的无私奉献。
如果低于r9d版本,Android studio 下ndk编译会出现 No rule to make target 的错误。
2 配置 ndk.dir
在 local.properties 添加如下配置:
sdk.dir=/path/to/android-sdk
ndk.dir=/path/to/android-ndk
‘拾’ 用cygwin编译JNI文件夹中的文件时,如何在JNI里建立子目录
没有人回答啊,小弟自己已经解决了,主要是写Android.mk文件,用LOCAL_C_INCLUDES
:=LOCAL_C_INCLUDES
+=来解决,这样编译器就知道你设置的路径了