gpt4 book ai didi

java - 获取有效的 JNIEnv 指针

转载 作者:IT老高 更新时间:2023-10-28 23:35:36 35 4
gpt4 key购买 nike

我有一个 C++ dll,我想通过将函数导出到 C# 来在 Unity 中使用它。 Unity 项目在 Android 设备上运行,C++ 代码使用 java。要初始化 C++,我需要先调用以下函数:

void api_initialize(JNIEnv* env, jobject* app_context, jobject* class_loader) {

JavaVM* vm = nullptr;
env->GetJavaVM(&vm);
if (!vm) {
return;
}

//Do other proprietary things
}

在 Unity 中,我有以下导出的 Dll 函数

    [DllImport (dllName)]
private static extern void api_initialize (IntPtr java_env, IntPtr app_context, IntPtr class_loader);

我的问题是如何在我的 C# 类中获取 JNIEnv 指针,然后将其作为参数传递给该函数?

我不是这个 API 的创建者,也没有修改它的权限,所以我需要从 JNIEnv 获取 JavaVM,而不是反过来。

最佳答案

我想你没有办法做到这一点(可能在那里但还没有看到)因为这种类型的 NDK 调用 需要 java 环绕,所以我想另外一个将 Java 用作 C# 调用的 intermediate 的解决方案,然后您可以从 java 将此调用 redirectNDK 代码 >.

using UnityEngine;
using System.Collections;
using System.IO;

#if UNITY_ANDROID
public class JavaCallPlugin {

// Avoid invalid calls
public static void initiateNDK() {
if (Application.platform != RuntimePlatform.Android)
return;

var pluginClass =
new AndroidJavaClass("com.package.class.UnityJavaDelegate");
AndroidJavaObject plugin =
pluginClass.CallStatic<AndroidJavaObject>("obj");
return plugin.Call("javaCallToNDK");
}
}
#endif

在你的 java 文件中这样做

package com.package.class;

import android.content.ContentValues;
import android.content.Intent;
import android.os.Environment;

public class UnityJavaDelegate{
private static UnityJavaDelegate obj;

// define function call to your NDK method with native keyword
private native void api_initialize();

static {
System.loadLibrary("yourlibraryname"); // setup your ndk lib to use
}

public static UnityJavaDelegate getObj() {
if(m_instance == null)
obj= new UnityJavaDelegate();
return obj;
}

private UnityJavaDelegate(){
}

public void javaCallToNDK(){
// this call may not work because i haven't passed class
// loader TO NDK before, if not then you should try links
// at the bottom of the post to know how to pass customize
// as parameter to NDK.

// put your call to NDK function here
api_initialize(this.getClass().getClassLoader());
}
}

当您声明 native 方法时,javah 会自动生成一个以 javaEnv 和 jobject 作为参数的 ndk 调用定义,所以我想您只需要在此处传递类加载器。您可以试试这个 linkthis链接以获取更多说明。

祝你好运。希望这会有所帮助。

关于java - 获取有效的 JNIEnv 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38862197/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com