编写.info文件

概述

drupal用.info文件来存储主题和模块的metadata。

对于模块来说,.info文件用于:

  • 为Drupal站点管理界面解析信息;
  • 为模块的激活和卸载提供标准和需求;
  • 提醒drupal一个模块的存在;
  • 便于一般的模块管理。

我们需要.info文件来识别模块。

示例

下面是一个.info文件的例子:

name = Really Neat Widget
description = Provides a really neat widget for your site's sidebar.
core = 7.x
package = Views
dependencies[] = views
dependencies[] = panels
files[] = tests/example.test
configure = admin/config/content/example

.info文件用该使用和模块一样的名称,并与模块文件一起存放在同一个文件夹内。比如,如果您的模块文件叫做example.module那么您的.info文件应该叫做example.info。

.info文件和.ini文件的格式一样,用等于号定义了不同元素的值(key=value),您也可以用引号把值括起来,引号括起来的值可以是多行的。

.info文件可以包含注释,用分号起始的行被视为注释,不会被解析。

元素

.info文件可以包含一下元素:

name(必须包含的)

      • 这是模块的显示名,将出现在模块的页面。因为这是模块要被显示的正规名字,所以我们每一个词的首字母要大写。而且要是便于用户识别的(不要包含下划线等等)。如果模块名包含了特殊的别名(css, UI, wysiwyg等)或者第三方商标(jQuery,Javascript ), 我们则遵照标准的命名。
name = Really Neat Widget

description(必须包含的)

      • 这是一个简短的最好只有一句的对模块功能的描述,它将显示在模块页面。注意,冗长的描述语言会使模块页面混乱,所以请注意言简意赅。字数被限制在255个字符。
description = Provides a really neat widget for your site's sidebar.
      • 描述可以包括超链接。下面这个例子包含了一个超链接来链接到作者的页面。当然也也可以链接到drupal.org的文档node。这比readme文件更加有用,当您要激活模块时,您可以方便的在线查看。
description = Domain manager by <a href="http://petermoulding.com">Peter Moulding .com</a>.

core(必须包含的)

      • 您模块工作的drupal版本。比如Drupal7的话就是7.x。注意模块不能细分到具体的版本号,比如6.x是正确的,而6.2则是错的。
core = 7.x

stylesheets(可选择的)

      • drupal7允许您在.info文件中添加css文件到每一个页面,和主题的.info文件功能相同。下面是一个在node模块中的.info文件例子:
stylesheets[all][] = node.css

scripts(可选择的)

      • 您可以在.info文件中添加javascript到drupal的每一页。这是集成javascript的最佳方法。而且这也是我们推荐的添加主流javascript文件的方法:
scripts[] = somescript.js

files(可选择的)

      • Drupal现在支持动态代码注册。所有的模块必须把包含类和接口声明的文件在.info文件里声明。比如:
name = Really Neat Widget
...
files[] = example.test

dependencies(可选择的)

      • 这是一个包含了您模块所需要的其他模块的数组。如果里面的模块没有出现在模块列表,您的模块是不能被激活的。如果这些模块没有被激活,系统将提示需要激活一下模块来激活本模块。

这个数组的值必须是模块文件名(以.module结尾),并全部小写,空格是不被允许的,就像下面的例子:

dependencies[] = taxonomy
dependencies[] = comment
      • 如果您想提别标记出所需模块iaode版本号,drupal夜在这个数组里提供方法。版本号不是必须添加的,除非您的模块必须需要某一版本的模块,一般是不许要添加版本号的。例子如下:
dependencies[] = modulename (major.minor)
      • 在这里major代表了主版本号,minor代表了分版本号。.x是可以代替所有的分版本号的。就像下面的例子:
name = Really Neat Widget
description = An example module
dependencies[] = exampleapi (1.x)
...
      • 在上面的例子中,example模块需要exampleapi模块来激活,版本1.0或者任何1.x的版本都可以。
dependencies[] = exampleapi (1.0)
      • 上面的例子只能允许版本你1.0的exampleapi模块来激活。
dependencies[] = exampleapi (1.x)
      • 上面的例子需要吧呢不能1.0或者任意1.x的exampleapi模块来激活。 
          • dependencies[]的元素也可以使用比较运算符:
            • =或者==代表等于
            • >大于
            • >=大于等于
            • !=不等于
dependencies[] = exampleapi (>1.0)
          • 上面的例子必须要版本号大于1.0的模块。



          • 您也可以制定核心模块的版本号:
dependencies[] = exampleapi (>7.x-1.5)
          • 上面的例子需要drupal7的任何版本,并且模块的版本号大于1.5.



          • 此外,多版本也是支持的,只需要用逗号把不同版本隔开:
dependencies[] = exampleapi (>1.0, <=3.2, !=3.0)

package(可选择的)

          • 如果您的模块与某些其他模块一同工作,或者您的模块功能与其他模块功能有较大不同,您可以在.info文件里添加一个package名。如果您不添加,那么drupal将默认将您的模块放到‘other'(“其他”)的模块列别中。一般来说我们只有在大型的模块租中才用到package名,或者这个模块对另外一组模块有一个功能的延伸, 比如Fields, Views, Commerce, Organic Groups等模块组。其他的模块我们一般都不设定package名。一般只有4个或4个以上的模块互相依赖或者有依赖关系,我们才把他们放到一个package。"Development" package是个例外,它将用于任何的编码工具模块中。



          • 在模块页面中,相同package的模块被显示在一起。所以字符应该保持一致性并遵循drupal的规则。
package = Views
          • 推荐的packge例子:
            • Administration
            • Commerce
            • Development
            • Fields
            • Media
            • User interface
            • Views
            • Voting (如果他需要VotingAPI)

模块package名大全

外部链接的图标
        • 在记录当前所有的package名,但这并不是我们推荐使用的。

php(可选择的)

          • 和drupal6一样,模块和主题可以吧他们需要的PHP版本标出 我们可以将类似于以下的例子加入到.info文件中去:
php = 5.3
        • 这里说明了模块或者主题不会在PHP5.3版本一下工作。如果模块用到了最新php版本的功能,这个元素将会很重要。如果php版本号没有被表明,那么说明该主题或模块对php的版本要求和drupal核心模块一样 。只有在模块要求的php版本号比核心模块高的时候,这个元素才需要标注。

version(不鼓励)

 

          • 这个版本号将被drupal.og生成,如果您的你模块已经建立并且被压缩封装。但是如果您的模块并不是在drupal.org的服务器上的,您可以随便用任意版本号。



          • 因为GIT中的.info文件不包含ersion,所以如果您是从git中获得的模块,您将不会有version号。如果您是用git直接获取模块,那么建议您用

git deploy

外部链接的图标
          • 模块来提供一个准确的version号。



        • 因为核心模块应用的不同的打包方法,所以版本号已经提前设定好。第三方模块不用遵循核心模块的例子。

configure(可选择的)

          • 在durpal7.x中,这代表了该模块配置页面的路径。如果这个模块被激活了,那么将会有“Configure"和Permissions"两个链接出现在模块列表页面。这就是“Configure"链接的路径。
configure = admin/config/content/example

required(可选择的)

        • 在drupal7.x中,主题和模块可以注明他们是绝对必须的,无论如何不能卸载的。用required = TRUE就可以让drupal在安装时就激活此主题或模块。一般来说,这只用于核心模块。

hidden(可选择的)

        • 在drupal7.x中,主题或模块可以注明他们是不能被显示在模块列表页面的。用hidden = TRUE就可以达到这个目的。一般用于测试的模块,当用SimpleTest测试时,一般用户不能激活该模块。

project(不鼓励,打包专用)

          • 模块的管理者不可以用这个元素。drupal.org将自动为这个元素赋值,来表明这个模块的出处。这个主要在

Update status

外部链接的图标
        • 模块中应用,这样drupal就可以检查package的版本号并提示管理员任何更新。

project status url (只能应用在自定义模块中,不能用于drupal.org的模块)

        • 这里允许管理员来提供一个URL来用Update status模块检查更新状态。在drupal.org发布的模块是不能用这个参数的。URL应该指向一个接受类似于http://my.domain.com/projects/{project}/{core}请求的RRS feed。比如:project status url应该被指向http://my.domain.com/projects。

更多关于.info文件格式信息请参考 drupal_parse_info_file() documentation

外部链接的图标

 

纠错

我已经写core = 7.x,但是系统还是"This version is incompatible with the 7.x version of Drupal core",这是怎么回事?

注意dependencies[]在drupal7的格式已经变了,错误的例子:

name = Really Neat Widget
...
dependencies = foo bar   ; 5.x dependency format.
core = 6.x

正确的写法:

name = Really Neat Widget
...
; Note the [], and that each of the dependencies is on its own line:
dependencies[] = foo
dependencies[] = bar
core = 7.x

描述和口音

非英语用户注意:如果您要在description中加入非英文字母,请注意编码格式和HTML编码编译。比如此类字母“&ouml”

<think>好的,我需要帮助用户了解如何为Unity编写和使用Android的.so文件。用户之前的问题涉及到安卓.so文件的基本定义、作用、开发关键点等,现在他们想具体知道如何在Unity中创建和使用这些文件。首先,我需要回顾用户提供的引用内容。引用[1]提到Unity2022.3版本导出的gradle工程中缺少libil2cpp.so,但空工程却包含,说明该版本没有bug,且不需要手动编译。这可能意味着Unity在构建时会自动处理.so文件,用户需要注意版本兼容性和构建设置。引用[2]展示了如何在Unity中使用C#通过DllImport调用.so中的函数,比如MathDll的Add和Max方法。引用[3]涉及使用NDK编译.so文件,设置NDK路径并使用ndk-build命令。结合这些信息,我需要分步骤指导用户如何创建.so文件并在Unity中使用。首先,用户需要编写C/C++代码,然后通过NDK编译生成.so,接着在Unity中通过C#调用这些库。需要注意ABI兼容性、JNI交互以及Unity的插件放置路径。 接下来,我需要确保结构清晰,分步骤讲解每个过程,包括代码示例和配置方法。同时,需要指出可能遇到的问题,比如ABI不匹配、JNI方法命名规则、Unity的插件目录结构等。此外,引用中的案例可以作为实际示例,比如引用[2]中的DllTest.cs脚本,展示如何声明和调用外部方法。 可能还需要提到Unity的IL2CPP机制,如引用[1]中的libil2cpp.so,说明Unity在构建时如何处理C++代码,避免用户混淆手动编译和自动生成的区别。同时,强调测试的重要性,建议用户创建空工程验证.so文件的正确性,如引用[1]中的发现。最后,生成相关问题,引导用户深入探讨,如如何优化.so性能、处理多ABI架构、调试技巧等。确保回答涵盖用户可能遇到的常见问题,并提供可靠的解决方案,参考之前的引用内容来增强答案的可信度。</think>### 如何为Unity创建和使用Android `.so`文件 #### 一、编写C/C++原生代码 1. **定义JNI接口** - 使用`JNIEXPORT`和`JNICALL`宏声明函数,遵循`Java_包名_类名_方法名`命名规则[^2] - 示例代码: ```cpp #include <jni.h> extern "C" { JNIEXPORT jint JNICALL Java_com_example_MyUnityActivity_Add(JNIEnv* env, jobject obj, jint x, jint y) { return x + y; } } ``` 2. **添加JNI头文件** - 确保包含`jni.h`头文件,路径通常为`$NDK_ROOT/sysroot/usr/include/jni.h` #### 二、编译生成`.so`文件 1. **配置NDK构建脚本** - 创建`Android.mk`和`Application.mk`文件 - `Android.mk`示例: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := MyLib LOCAL_SRC_FILES := MyLib.cpp include $(BUILD_SHARED_LIBRARY) ``` - `Application.mk`示例(指定ABI): ```makefile APP_ABI := armeabi-v7a arm64-v8a x86 ``` 2. **执行编译命令** ```bash $NDK_ROOT/ndk-build -B ``` 生成的`.so`文件位于`libs/<ABI>/`目录下[^3] #### 三、Unity集成与调用 1. **文件目录规范** - 将`.so`文件按ABI分类,放置到Unity项目的`Assets/Plugins/Android/libs/<ABI>/`目录中 - 目录结构示例: ``` Assets/ Plugins/ Android/ libs/ arm64-v8a/ libMyLib.so armeabi-v7a/ libMyLib.so ``` 2. **C#调用接口** - 使用`[DllImport]`属性声明原生方法[^2] - 示例代码: ```csharp using System.Runtime.InteropServices; public class NativeWrapper { [DllImport("MyLib")] public static extern int Add(int x, int y); } // 调用示例 void Start() { Debug.Log(NativeWrapper.Add(3, 5)); // 输出8 } ``` #### 四、关键注意事项 1. **ABI兼容性** - 需为所有目标架构(如`arm64-v8a`、`armeabi-v7a`)编译`.so`文件[^3] - Unity 2022.3版本已自动处理`libil2cpp.so`生成,无需手动干预[^1] 2. **JNI交互规范** - 确保C++函数签名与Java/Kotlin声明完全匹配 - 避免内存泄漏:在JNI中及时释放`jobject`和`jarray` 3. **Unity插件配置** - 若使用IL2CPP脚本后端,需确保`.so`文件与IL2CPP架构一致 - 在`Player Settings`中启用`ARM64`支持(针对64位设备) #### 五、调试与验证 1. **日志输出** - 在C++代码中添加Android日志: ```cpp #include <android/log.h> #define LOG_TAG "NativeLib" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) JNIEXPORT void JNICALL Java_com_example_MyClass_test(JNIEnv* env, jobject obj) { LOGI("Native method called"); } ``` 2. **符号表检查** - 使用`nm`命令验证`.so`文件是否包含目标函数: ```bash nm -D libMyLib.so | grep "Java_com_example" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值