unity 调用C++库(android+jni+window dll平台实现)

方便不知道如何再unity调用各平台动态库的同学参考,实测可用:

window案例


动态库名

tracker_model.dll

位置

unity工程 Assets\Plugins目录下

c# 关键调用

代码 

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using System.Collections.Generic;

//[StructLayout(LayoutKind.Sequential)]
public struct Point3F {
 public float x;
 public float y;
 public float z;
}

public class Control : MonoBehaviour {

System.IntPtr center_data_prt;

System.IntPtr fingertips_data_prt;

[DllImport("tracker_model")]
 public static extern long points_init (string iin);

........

void Start () {
  handle = points_init(fileName);

...................

center_data_prt = Marshal. AllocHGlobal(Marshal.SizeOf(typeof(Point3F)));

fingertips_data_prt = Marshal. AllocHGlobal(Marshal.SizeOf(typeof(Point3F))*maxFingerTips);

tri_cnt = points_get_fingertips(handle, center_data_prt, fingertips_data_prt


}

 void Update () {

Point3F center = (Point3F)Marshal.PtrToStructure(
    (System.IntPtr)(center_data_prt.ToInt64()),typeof(Point3F));


for (int i = 0; i < tri_cnt; i++) {
    Point3F point = (Point3F)Marshal.PtrToStructure(
     (System.IntPtr)(fingertips_data_prt.ToInt64()+i*Marshal.SizeOf(typeof(Point3F))),typeof(Point3F));

}

}

void OnDestroy(){

Marshal.FreeHGlobal(center_data_prt);

Marshal.FreeHGlobal(fingertips_data_prt);

}


对应tracker_model.dll c++头文件接口

#ifndef _model_api_H_
#define _model_api_H_

#ifdef WIN32
#ifdef HTM_DLL_EXPORT
#define HTM_API extern "C" _declspec(dllexport)
#else
#define HTM_API extern "C"  _declspec(dllimport)
#endif
#else
#define HTM_API
#endif

struct Point3F
{
 float x;
 float y;
 float z;
};

HTM_API long points_init(const char *config_file);

HTM_API int  points_get_tri(long handle, Point3F* triangle_vertex_list, int list_len);

~~~~~~~

具体动态库编译过程不叙述



Android jni

(android ndk 编译c++库过程 具体不叙述  jni工程制作也不叙述,网上有  )

jni方法:
/*编译接口类:
 *
 * http://www.2cto.com/kf/201409/330892.html
 *
进入项目文件夹, 生成JNI的头文件, 使用命令:
javah -classpath bin/classes -d jni com.example.hellomyjni.JniClient
命令解析:
javah 生成头文件;
-classpath 使用类的位置(bin/classes), 都是.class文件;
-d jni 需要生成JNI的类(com.example.hellomyjni.JniClient), 包括[package].[classname].
按F5刷新项目, 项目会自动生成jni文件夹, 并包含一个头文件com_example_hellomyjni_JniClient.h.
右键点击项目在Android Tools里面点击Add NativeSupport, 就会自动生成: HelloMyJni.cpp和Android.mk.
*/

1 unity使用c#调用android函数案例

 制作unity的android插件(具体流程百度)
 创建完插件和目录后 unity工程下有Assets\Plugins\Android\libs目录



2  eclipse下利用jni制作c++库如下

</
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 中,可以使用 Android 的 API 来读取本地图片。下面是一个简单的代码示例: ```csharp using UnityEngine; using System.IO; public class LoadLocalImage : MonoBehaviour { public string imagePath; void Start() { // 获取 Android 的 Context 对象 AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity").Call<AndroidJavaObject>("getApplicationContext"); // 读取图片文件 string filePath = Path.Combine(Application.streamingAssetsPath, imagePath); AndroidJavaObject file = new AndroidJavaObject("java.io.File", filePath); // 创建 Bitmap 对象 AndroidJavaClass bitmapFactory = new AndroidJavaClass("android.graphics.BitmapFactory"); AndroidJavaObject bitmap = bitmapFactory.CallStatic<AndroidJavaObject>("decodeFile", file.Call<string>("getAbsolutePath")); // 将 Bitmap 转换为 Texture2D 对象 byte[] byteArray = bitmap.Call<byte[]>("getNinePatchChunk"); Texture2D texture = new Texture2D(1, 1); texture.LoadImage(byteArray); // 在 Unity 中显示图片 GetComponent<Renderer>().material.mainTexture = texture; } } ``` 上面的代码中,`imagePath` 是图片文件在 StreamingAssets 目录下的相对路径。在 Android 中,需要获取 Context 对象来操作文件系统。首先,创建一个 `AndroidJavaClass` 对象来获取 UnityPlayer 类,然后调用 `currentActivity` 方法获取当前 Activity 对象(即 UnityPlayerActivity),最后调用 `getApplicationContext` 方法获取 Context 对象。然后,使用 `java.io.File` 类读取图片文件。接着,使用 `android.graphics.BitmapFactory` 类创建 Bitmap 对象,并调用 `decodeFile` 方法解码图片文件。最后,将 Bitmap 转换为 Texture2D 对象,并在 Unity 中显示图片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值