从Unity Script调用Android NDKfunction

所以我正在创建一个使用Unity的Android应用程序……我从Unity获得了一些资产包,但我不知道Unity开始之前的url。 因此Unity需要调用Native(Android)端的函数来获取url。

我已经失去了一段时间如何做到这一点(Unity文档是非常可怕的imho)。 我决定用NDK来帮助我。 没有Unity,关于我的库文件的一切都可以解决……现在问题是在Unity中调用这些C函数。

这是我的lib:

#include  #include  #include  #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)坏事发生

我走错了路吗? (就像我说的,我需要做的就是获得一个字符串)。 有任何想法吗?

我建议放弃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("instance"); return plugin.Call("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("getURL", new object[] {"http://thisIsMyUrl.com"});

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

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