1.环境准备
1.1 安装JDK:jdk1.8.0_112
1.2 安装Android SDK
SDK可以安装指定平台和ndk-bundle。出于兼容性考虑,单独安装旧版本的android-ndk-r10b
1.3 安装VS2019
安装VS2019并选择:使用C++进行移动开发。
1.4 连接开发手机
使用USB数据线连接开发手机,并打开开发手机的USB调试选项。
2。创建Android动态库项目
2.1?创建新项目
启动VS2019,选择创建新项目
2.2 选择项目类型
从下拉框中选择C++和Android,从列表中选择动态共享库(Android),然后单击下一步
2.3 填写项目属性
填写项目名称:MyTestSo,选择创建位置,点击创建
2.4?项目创建完成
3.?创建动态库测试项目
3.1 新建一个Android项目
右键单击解决方案,然后在弹出菜单中选择“添加”->“新建项目”菜单项。
3.2?选择项目类型
在下拉框中选择C++和Android,在列表中选择Native-Activity应用程序(Android),然后单击下一步
3.3?填写项目属性
填写项目名称:Test,点击创建
?
3.4 项目创建完成
?3.5 ??????添加引用
右键单击左侧Test.NativeActivity项目下的引用,选择弹出菜单:添加引用(R)…
选择MyTestSo,点击确定完成设置。
4.设置IDE属性
?选择VS2019菜单项:工具->选项,打开选项设置页面。
选择Cross-Platform –> C++ –> Android,填写右侧的开发工具目录。
5.设置项目属性
?直接编译创建的工程会出现如下错误:
需要设置MyTestSo项目和Test.NativeActivity项目的编译属性。下面以MyTestSo项目为例。
打开MytestSo项目属性,左侧选择General,修改右侧平台工具集为:GCC 4.9,目标API级别为android-L。
6.编译运行 6.1 修改动态库工程代码
在MyTestSo.cpp源代码文件中添加测试功能test,代码如下:
???
无效测试()
{
LOGI(“MyTestSo 的 Hello World”);
}
6.2??????修改测试项目代码
在main.cpp源代码文件中调用测试函数test。代码如下:
extern "C" void test();
测试();
??????6.3?编译并运行项目
将Test.Packaging项目设置为启动项目,选择编译并运行Test.Packaging项目,并查看Logcat输出日志。
项目在某些低版本Android平台上运行时可能会崩溃。解决方法请参考第7节。
6.4 调试代码
在main.cpp或MyTestSo.cpp中设置断点,调试并启动Test.Packaging项目,就会在设置的断点处中断,效果如下图:
7。解决了崩溃问题
项目在某些低版本Android平台上运行时可能会崩溃,出现如下错误:
原因是www.sychzs.cn库依赖于www.sychzs.cn库,而项目在运行时加载www.sychzs.cn库之前没有加载www.sychzs.cn库,导致崩溃。解决办法是自定义项目启动类,并在启动类中加载so库。
??????7.1?定制项目启动类
在项目Test.Packaging中添加目录结构:src/com/mytest,并在mytest目录下创建java源文件www.sychzs.cn,内容如下:
包com.mytest;
导入android.app.NativeActivity;
公共类 MyTestActivity 扩展了 NativeActivity
{
静态
{
System.loadLibrary("MyTestSo");
System.loadLibrary("测试");
}
}
?
7.2?修改AndroidManifest.xml
打开AndroidManifest.xml编辑内容,
android:hasCode 属性修改为:trueandroid:name 属性修改为:com.mytest.MyTestActivity
7.3 重新编译并运行项目
附录:使用jar包
原文链接:https://www.sychzs.cn/visual-studio-android-ndk-jar-files.html
Android NDK、JAR 文件、JNI 和 Visual Studio
对于那些不知道的人来说,我已经是 Visual Studio 用户很长时间了,在其他形式的 IDE 中,我使用 Visual Studio 最多。我还喜欢使用 C 编程语言(我希望 VS 对于 C 来说是最新的,但它已经足够好了)。您可以做的事情之一是使用 NDK 和 Visual Studio 进行 Android 开发,效果相当好,即使它使用 Ant 而不是 Gradle,我发现它到目前为止已经满足了我的所有需求。话虽这么说,我将在这里提出一些关于如何使开发过程更加友好以便能够通过 JNI 和本机代码进行交互的提示。
注意:我假设您已经设置了 Visual Studio 并安装了本机 Android 开发
更新蚂蚁
如果您通过 Visual Studio 安装了 Android 原生开发,则您需要的所有内容(NDK 和 SDK)都应该位于“C:/Microsoft”文件夹中。我们需要做的就是告诉 Ant 构建系统使用更现代版本的 JDK (OpenJDK) 来构建 java 代码。为此,请在文本编辑器中打开?C:/Microsoft/AndroidSDK/25/tools/ant/build.xml?文件并找到以? 项目.properties 我的项目属性文件在?.sln?中如下所示: #项目目标 目标=$(androidapilevel) # 通过设置 jar.libs.dir= jar.libs.dir=libs AndroidManifest.xlm 由于我们要编写 .jar 文件并可能在运行时加载到外部库中,因此我们需要设置我们的项目以拥有自己的自定义本机活动代码。在?AndroidManifest.xlm?文件中,您需要在? 接下来我们要设置? 创建我们的自定义活动 由于我们的完整类路径是?com.PackageName.FancyActivity?我们需要在 Visual Studio 中的?*.Packaging?项目中创建一些文件夹。创建名为 src/com/PackageName/ 的文件夹路径。接下来在“PackageName”文件夹中创建一个名为“www.sychzs.cn”的文件。下面是您应该在 www.sychzs.cn 中包含的代码: package com.PackageName; 导入android.app.NativeActivity; 公共类 FancyActivity 扩展了 NativeActivity { 静态 { //System.loadLibrary("other_lib"); } } 注意注释掉的行?System.loadLibrary。您可以根据需要多次调用它,但您所需要做的就是将“other_lib”替换为您的库的名称,例如System.loadLibrary(“fmod”);或类似的名称。此时您应该能够毫无问题地进行构建。 专业提示:?您应该始终添加?System.loadLibrary(“ProjectName”);?其中?ProjectName?是为您的NDK项目构建生成的?.so?文件的名称。这将允许您从 Java 代码中调用本机函数(非常适合回调等)。 自定义 JAR 文件 现在我们已经设置了 Activity 以更好地与 JNI 交互并加载其他库,我们将了解如何添加我们自己的 .jar 文件并从本机代码访问其中的类型。 构建 .jar 文件 确保使用“-source 1.7 -target 1.7”编译您的代码,以便它与我们之前设置的 Ant 版本相匹配。构建完 .class 文件后,请确保您的文件夹结构与包路径相关,正确无误。如果您的类的包路径是?package com.PackageName;?那么您应该在文件夹结构?com/PackageName/*.class 中拥有.class 文件。当您构建?.jar?文件时,它应该适用于整个文件夹结构。 在项目中包含.jar文件 现在您已经拥有了?.jar?文件,您应该在您的?*.Packaging?项目中创建一个名为?libs?的文件夹。将您的 .jar 文件放入此文件夹中,并确保右键单击它并选择“包含在项目中”。 访问 .jar 文件中的代码 假设对于这一部分,您创建了一个名为“Dummy”的类,其函数具有签名“void SayHi(string name)”,它将打印出“Hello, %s!” (%s =?名称?函数的输入字符串)。我们将使用 JNI 访问您的代码并调用您的方法。下面是我们将用来调用函数的代码。你可以将它直接放在你的 void android_main(struct android_app* state)?function: JNIEnv* env = NULL; const ANativeActivity* 活动 = 状态->活动; (*活动->vm)->附加当前线程(活动->vm, &env, 0); jobobject jobj = 活动->clazz; jclass clazz = (*env)->GetObjectClass(env, jobj); jmethodID getClassLoader = (*env)->GetMethodID(env, clazz, "getClassLoader", "()Ljava/lang/ClassLoader;"); jobject cls = (*env)->CallObjectMethod(env, jobj, getClassLoader); jclass classLoader = (*env)->FindClass(env, "java/lang/ClassLoader"); jmethodID findClass = (*env)->GetMethodID(env, classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); jstring strClassName = (*env)->NewStringUTF(env, "com.PackageName.Dummy"); jclass fancyActivityClass = (jclass)((*env)->CallObjectMethod(env, cls, findClass, strClassName)); (*env)->DeleteLocalRef(env, strClassName); jmethodID sayHi = (*env)->GetStaticMethodID(env, fancyActivityClass, "SayHi", "(Ljava/lang/String;)V"); jstring 单词 = (*env)->NewStringUTF(env, "Brent"); (*env)->CallStaticVoidMethod(env,fancyActivityClass,sayHi,words); (*env)->DeleteLocalRef(env,单词); ??????现在那些接触过 JNI 的人可能会说“我们不能直接使用?(*env)->FindClass?方法吗?虽然对于普通的 Android 内置类来说这可能是正确的,但对于我们自己的自定义类来说却并非如此。原因是 JNI 只能查看当前堆栈上的内容,不管你信不信,即使我们的 FancyActivity 正在运行我们的代码,它也不在堆栈上,所以我们甚至找不到它。所以我们需要做的是获取当前的activity,然后在它上面找到一个名为getClassLoader的方法。一旦我们有了这个函数,我们就可以从加载的任何地方自由加载任何类,甚至在我们的?.jar?code 中。 希望这可以帮助有困难的人。我花了一整天的时间才弄清楚所有这些东西,因为互联网上没有任何直接的东西,我必须深入挖掘才能找到将这些东西组合在一起的所有部分! 1.界面 在资源>布局>目录下的*.xml文件就是界面文件 2.关联界面 接下来,通过将支持代码插入到 MainActivity 类中来添加代码以关联用户界面。 找到?OnCreate? “MainActivity”中的方法类,并添加关联的按钮代码如下: protected override void OnCreate(Bundle savingInstanceState) { /*这部分是程序自带的代码*/ base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(此,savedInstanceState); //从“主”布局资源设置我们的视图 SetContentView(Resource.Layout.activity_main); //通过ID绑定控制 按钮任务1 = FindViewById(Resource.Id.button1); 按钮任务2 = FindViewById(Resource.Id.button2); 按钮任务3 = FindViewById(Resource.Id.button3); 按钮任务4 = FindViewById(Resource.Id.button4); 按钮停止= FindViewById(Resource.Id.button5); TextView显示= FindViewById(Resource.Id.textView1); //添加控件对应的事件 任务1.单击+=(发件人,e)=> { Show.Text = "任务 1 正在进行中..."; }; 任务2.单击+=(发件人,e)=> { Show.Text = "任务 2 正在进行中..."; }; 任务3.单击+=(发件人,e)=> { Show.Text = "任务三正在进行中..."; }; 任务4.点击+=(发件人,e)=> { Show.Text = "任务 4 正在进行中..."; }; } 现在您已经完成了一个响应按钮事件的简单程序。 最近发现vs2019可以开发Android。一直想找机会尝试一下,发现效果确实不错。 先安装vs2019,然后如图: 选择使用 .NET 进行移动开发 然后等待安装完成。 选择打开还是新建项目? Android 应用程序 (Xamarin) 然后选择对应的当前模板和对应的Android最低版本,然后就OK了? 打开工具-Android-设备管理器,创建模拟设备 打开项目。右侧Resources->content_main是左侧视图中显示的内容。也可以像winfrom一样将控件拖到屏幕上 点击Simulation Run,就会弹出模拟器。如果选择真机模拟,还需要开启开发者模式,直接调试,以获得更好的效果。 接下来我们会将其作为Android安装包以apk形式发布。 调试时为Debug模式,发布包时为Release模式。 更改模式后,右键单击项目并保存 存档成功后,会出现三个选项。打开文件夹里的apk就不行了,安装直接崩溃。因此,我们需要分发的apk并选择分发。 选择临时,或者您想要发布到 Google Play。 选择 1 个位置添加您的徽标 然后单独保存就可以得到apk了 这样您就可以将您的?com.companyname.app1.apk安装包发送到您的Android手机或模拟器上使用。 最终手机截图如下: ? ?
0条大师的评论