从Unity Script调用Android NDK功能
问题描述:
因此,我创建了一个使用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)
不好的事情发生
难道我走了关于这个错误的方式? (就像我说的,我需要做的就是获取一个字符串)。有任何想法吗?
答
我建议沟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!
答
您可能会在您致电getURL时发送'动态'网址。这样做:
return plugin.Call<string>("getURL", new object[] {"http://thisIsMyUrl.com"});
,然后你的java看起来像这样:
public String getURL(Object newUrl) {
return newUrl.ToString();
}
即将实现......我可能只是爱你 – IamAlexAlright 2012-02-03 01:22:21
好吧,我一直得到NullPointerExceptions - >我已经更新以显示我的代码 – IamAlexAlright 2012-02-03 02:43:54
您可以发布例外吗? – peterept 2012-02-03 03:23:52