问题 Xamarin:使用NDK构建的.so


我在C中的eclipse(Android项目)上创建了两个简单的函数(设置并返回一个int)。我用过 NDK建造  产生一个.so。我如何在Xamarin上使用这个.so并在我的Xamarin.Android项目中使用这两个函数?

谢谢!


4499
2018-04-09 08:12


起源



答案:


假设我们有一个名为MyTest.so的共享库,我们想在Xamarin.Android项目中使用它。 MyTest.so由一个函数组成

int MyTest_GetValue();

现在,我们需要在Xamarin.Android项目中使用此功能。以下是成功的步骤:

步骤1:在Xamarin.Android项目中创建一个名为lib和子文件夹armeabi的新文件夹。如上所述,复制我的.so库以在armeabi文件夹中使用 这里 

步骤2:设置库的属性.so(导入的库)将操作构建到“AndroidNativeLibrary”并复制到输出到“始终复制”。

第3步:(在Xamarin.Android类中工作,例如:MainActivity.cs)

  • 通过“using System.Runtime.InteropServices;”包含命名空间InteropServices。

  • 使用项目中的标准DllImport导入本机库,如下所示: [的DllImport( “MyTest.so”)] public extern static int MyTest_GetValue(); //在.so Lib中具有完全功能名称,类型和参数。

第4步:在应用程序中使用上面的函数(MyTest_GetValue())。

例如:

int value = MyTest_GetValue();

Console.Writeline(value.ToString());

任务完成! :d


14
2018-04-09 12:55



你能用[out]参数显示一个示例函数吗?像bool MyTest_GetValue(string * retVal);谢谢 - hrz
据我所知,使用[out]参数不应该有任何不同。执行步骤1和2,然后执行包含带[out]参数的功能的步骤3,最后执行步骤4以消耗该功能应该可以正常工作。注意:Xamarin自2013年以来发生了很大的变化(这个问题)。 - Saurav Aran


答案:


假设我们有一个名为MyTest.so的共享库,我们想在Xamarin.Android项目中使用它。 MyTest.so由一个函数组成

int MyTest_GetValue();

现在,我们需要在Xamarin.Android项目中使用此功能。以下是成功的步骤:

步骤1:在Xamarin.Android项目中创建一个名为lib和子文件夹armeabi的新文件夹。如上所述,复制我的.so库以在armeabi文件夹中使用 这里 

步骤2:设置库的属性.so(导入的库)将操作构建到“AndroidNativeLibrary”并复制到输出到“始终复制”。

第3步:(在Xamarin.Android类中工作,例如:MainActivity.cs)

  • 通过“using System.Runtime.InteropServices;”包含命名空间InteropServices。

  • 使用项目中的标准DllImport导入本机库,如下所示: [的DllImport( “MyTest.so”)] public extern static int MyTest_GetValue(); //在.so Lib中具有完全功能名称,类型和参数。

第4步:在应用程序中使用上面的函数(MyTest_GetValue())。

例如:

int value = MyTest_GetValue();

Console.Writeline(value.ToString());

任务完成! :d


14
2018-04-09 12:55



你能用[out]参数显示一个示例函数吗?像bool MyTest_GetValue(string * retVal);谢谢 - hrz
据我所知,使用[out]参数不应该有任何不同。执行步骤1和2,然后执行包含带[out]参数的功能的步骤3,最后执行步骤4以消耗该功能应该可以正常工作。注意:Xamarin自2013年以来发生了很大的变化(这个问题)。 - Saurav Aran