H5W3
当前位置:H5W3 > Andriod > 正文

【安卓】从Unity脚本调用Android NDK功能

我正在用Unity制作Android应用程序,我从Unity得到了一些资源包,但是Unity启动之前我不知道URL。因此,Unity需要调用本机(Android)的功能来获得URL。
我不知道应该怎么做(依我看来Unity文档很坑爹)。我决定用NDK来解决这一问题,不用Unity就能解决library里的文件。现在问题是怎样在Unity里调用这些C函数。
这是我的lib:

#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;
}

Unity代码加载library没问题(使用[DllImport (“libname”)])。
现在,如果我“正确的”加载这个功能,就像private static extern jstring Java_com_lyfelotto_blah_blah_getURL(JNIEnv * env, jobject this),不好的事情就会发生。
是不是我做错了什么?(就像我说的,我所要做的是得到一个字符串)。有没有解决办法?

原问题:Calling Android NDK function from Unity Script

回答

来自@peterept 的答案:

我建议放弃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.放到Assets/Plugins/Android 文件夹。
不需要 NDK!


来自@Yuri Visser 的回答:

你可以在调用时发送动态URL来获得URL。像这样做:

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

然后java 看起来是这个样子的:

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

本文地址:H5W3 » 【安卓】从Unity脚本调用Android NDK功能

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址