繁体   English   中英

从Unity脚本调用Android NDK函数

[英]Calling Android NDK function from Unity Script

因此,我正在创建一个使用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)那样“正确”加载函数,则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!

您可能会在对getURL的调用中发送“动态” URL。 做类似的事情:

return plugin.Call<string>("getURL", new object[] {"http://thisIsMyUrl.com"});

然后你的java看起来像这样:

public String getURL(Object newUrl) {
    return newUrl.ToString();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM