2012-02-02 81 views
2

因此,我创建了一个使用Unity的Android应用程序...我从Unity获取一些assetbundle,但在Unity启动之前我不知道该url。因此,Unity需要在Native(Android)端调用一个函数来获取url。从Unity Script调用Android NDK功能

我已经迷失了一段时间如何做到这一点(Unity文档是非常可怕的恕我直言)。我决定用NDK来帮助我。如果没有Unity,我的库文件的所有内容都可以解决......现在问题就是在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; 
} 

我的统一代码加载库就好了(使用[DllImport ("libname")])。

现在,如果我“正确”这样的装载功能private static extern jstring Java_com_lyfelotto_blah_blah_getURL(JNIEnv * env, jobject this)不好的事情发生

难道我走了关于这个错误的方式? (就像我说的,我需要做的就是获取一个字符串)。有任何想法吗?

回答

4

我建议沟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"; 
    } 
} 

和向Assets/Plugins/Android文件夹扔UnityUrlPlugin.jar。

不需要NDK!

+0

即将实现......我可能只是爱你 – IamAlexAlright 2012-02-03 01:22:21

+0

好吧,我一直得到NullPointerExceptions - >我已经更新以显示我的代码 – IamAlexAlright 2012-02-03 02:43:54

+0

您可以发布例外吗? – peterept 2012-02-03 03:23:52

0

您可能会在您致电getURL时发送'动态'网址。这样做:

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

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

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