从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

阅读 7.6k
1 个回答

来自@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();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题