java - 从Unity脚本调用Android NDK函数

标签 java android android-ndk unity-game-engine

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

我已经迷失了一段时间了,不知道如何做到这一点(恕我直言,Unity 文档非常糟糕)。我决定使用 NDK 来帮助我。如果没有 Unity,我的库文件的所有内容都会正常运行...现在的问题是在 Unity 中调用这些 C 函数。

这是我的库:​​

    #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";
  }
}

并将 UnityUrlPlugin.jar 放入 Assets/Plugins/Android 文件夹中。

不需要NDK!

关于java - 从Unity脚本调用Android NDK函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121781/

相关文章:

java - 为什么 Firebase 数据库上的循环会一次又一次地添加数据?

android - 安装 Android NDK 时遇到错误

android - 访问 native 音频记录

java - Java 中无法访问的代码

java - 在没有maven的多模块J2EE Web项目中配置log4j2

java - 在java中打印使用long[]构建的数组

java - 在线作业的高级字符串操作

android - 无法将 View 添加到以编程方式添加的 ViewGroups

android - Android 上存在 fragment 问题的 ListView

android - 在 android 嵌入式中构建 v8 时出错