当前位置: 首页 > 面试题库 >

从Unity脚本调用Android NDK函数

阎弘
2023-03-14
问题内容

因此,我正在创建一个使用Unity的Android应用…从Unity获得了一些资产捆绑,但在Unity启动之前我不知道该URL。因此,Unity需要在本机(Android)端调用一个函数来获取URL。

我已经迷路了一段时间(Unity文档非常糟糕,恕我直言)。我决定使用NDK来帮助我。没有Unity,关于我的库文件的所有工作都会解决……现在问题是在Unity中调用这些C函数。

这是我的书房:

    #include <jni.h>  
#include <string.h>  
#include <android/log.h>

#define DEBUG_TAG "NDK_blahy"

extern "C" {
    jstring Java_com_blah_blah_getURL(JNIEnv * env, jobject this);
    void Java_com_blah_blah_setURL(JNIEnv * env, jobject this, jstring URL);  
}

jstring url;

void Java_com_blah_blah_setURL(JNIEnv * env, jobject this, jstring URL)  
{  
    url = URL;

    jboolean isCopy;  
    const char * szLogThis = (*env)->GetStringUTFChars(env, URL, &isCopy);

    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szLogThis);

    (*env)->ReleaseStringUTFChars(env, URL, szLogThis);  
}

jstring Java_com_lyfelotto_blah_blah_getURL(JNIEnv * env, jobject this)  
{  
    return url;  
}

我的统一代码可以很好地加载库(使用[DllImport ("libname")])。

现在,如果我像这样正确“加载”函数,则会private static extern jstring Java_com_lyfelotto_blah_blah_getURL(JNIEnv * env, jobject this)发生不好的事情

我做错了这个办法吗?(就像我说的,我需要做的只是获取一个字符串)。有任何想法吗?


问题答案:

我建议抛弃NDK。使用Android Java插件。

在YourPlugin.cs中:

using UnityEngine;
using System.Collections;
using System.IO;

#if UNITY_ANDROID
public class UnityUrlPlugin {

  // Logs the user out and invalidates the token
  public static string getUrl() {
    if( Application.platform != RuntimePlatform.Android )
      return;

    var pluginClass = new AndroidJavaClass("com.you.UnityUrlPlugin") ;
    AndroidJavaObject plugin = pluginClass.CallStatic<AndroidJavaObject>("instance");
    return plugin.Call<string>("getURL");
  } 
}
#endif

然后,在UnityUrlPlugin.java中:

package com.you;

import android.content.ContentValues;
import android.content.Intent;
import android.os.Environment;

public class UnityUrlPlugin {

  private static UnityUrlPlugin m_instance;

  public static UnityUrlPlugin instance() {
    if(m_instance == null)
      m_instance = new UnityUrlPlugin();
    return m_instance;
  }

  private UnityUrlPlugin(){
  }

  public String getURL() {
    return "http://blah.com";
  }
}

并将UnityUrlPlugin.jar放入Assets/Plugins/Android文件夹。

无需NDK!



 类似资料:
  • 问题内容: 我试图弄清楚如何从Shell脚本调用Python函数。 我有一个具有多个功能的Python文件,我需要在我的shell脚本中使用它们返回的值。有没有办法做到这一点。 我这样做是为了使用Python读取配置文件并在shell中获取值。还有其他更好的方法来实现这一目标。 包含: 我需要将Python函数返回的值存储在shell变量中。 问题答案: 您可以通过要求Python解释器打印结果来

  • 我是一个本地开发人员和新的Unity。我试图发挥我的优势,在Kotlin编码,然后使用我的代码作为一个插件在Unity。我遇到的一个问题是,我不知道如何引用伴生对象内部的函数。 但我怎样才能在团结中也这样做呢?以下是我尝试过的。 我收到的错误是, AndroidJavaException:java.lang.NosuchMethodError:没有具有name='factory'signature

  • 问题内容: 我想从Java调用R脚本。我已经对该主题进行了google搜索,但是我看到的几乎所有结果都需要我向某些第三方库添加依赖项。任何人都可以向我展示一种在不添加任何依赖项的情况下完成同一件事的好方法吗? 我正在使用Windows计算机,因此也许我可以使用命令行来启动R(如果尚未打开)并运行特定的R脚本。但是我从未写过命令行代码(或从Java调用过),因此我需要代码示例。 我将使用命令行思路包

  • 问题内容: 我正在尝试从python这样启动PowerShell脚本: 问题是我得到以下错误: 无法加载文件C:\ Users \ sztomi \ workspace \ myproject \ buildxml.ps1,因为在此系统上禁用了脚本的执行。请参阅“获取有关about_signing的帮助”以了解更多详细信息。 尽管事实上我很早以前确实通过键入管理员运行的PS终端来启用Powersh

  • 问题内容: 我有要从Python脚本调用的Perl脚本。我一直在寻找,并没有成功。我基本上是试图调用向Perl脚本发送1变量的方法,但是不需要Perl脚本的输出,因为它是一个自包含程序。 到目前为止,我想出的是: 只有刚刚开始的Python编程,所以我确定以上内容完全是胡说八道。任何帮助将非常感激。 问题答案: 如果您只想打开通往perl解释器的管道,那么您的方向正确。我认为您唯一缺少的是perl

  • 我在Unity Vuforia做一个地面飞机项目。在最新版本的Vuforia中,有一个预定义的复选框,而不是导入单独的DeployStageOnce脚本。我想要seperate DeployStageOnce脚本。我想研究它,知道它是如何工作的。我到处都找不到剧本。有人有吗?还是链接?如果有请提供。 多谢!