Вызов функции Android NDK из скрипта Unity - PullRequest
2 голосов
/ 03 февраля 2012

Итак, я создаю приложение для Android, которое использует Unity ... Я получаю некоторый пакет ресурсов от Unity, но я не знаю URL до запуска Unity.Таким образом, Unity необходимо вызвать функцию на стороне Native (Android), чтобы получить URL.

Я некоторое время терялся в том, как это сделать (документация Unity довольно ужасна, imho).Я решил использовать NDK, чтобы выручить меня.Без Unity все в моем библиотечном файле работает ... теперь проблема заключается в вызове этих функций C в Unity.

Вот моя библиотека:

    #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 загружает библиотеку простонормально (используя [DllImport ("libname")]).

Теперь, если я загружу функцию "правильно", как это private static extern jstring Java_com_lyfelotto_blah_blah_getURL(JNIEnv * env, jobject this) плохие вещи случаются

Я поступил неправильно?(Как я уже сказал, все, что мне нужно сделать, это получить строку).Есть идеи?

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

Предлагаю угробить НДК.Используйте Java-плагин для Android.

В 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 в *Папка 1009 *.

Нет необходимости в NDK!

0 голосов
/ 20 февраля 2012

Скорее всего, вы можете отправить динамический URL-адрес в вашем вызове getURL.Сделайте что-то вроде:

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

и тогда ваша Java будет выглядеть так:

public String getURL(Object newUrl) {
    return newUrl.ToString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...