← 返回目录

fbxsdk 的 JNI 库

发布时间: 2016-08-03 00:28:14
浏览量: 1595
标签: fbxsdk JNI
fbxsdk 的 JNI 库

fbxsdk是用来读写autodesk的fbx的库,但是是一个c++库,在java上无法直接使用,也没有找到有人做了这个工作,只好自己写一个jni的库

原理:


  1. 使用lynx从 http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/cpp_ref/hierarchy.html 把文档抓下来,转成文件.
  2. 写了一个shell的脚本把转成普通文本的文档进行分析,找出类名,方法和属性,自动生成对应的cpp和java文件
  3. 手动修复少量的文档错误和增加一些辅助类的工具,加上文档中没有的枚举值
  4. 编写makefile,编译成JNI的动态库
  5. java程序开始时,加载一下System.loadLibrary("FbxsdkJni"), 然后就可以用了。



所有的类和结构转成了指针,然后转成java的long类型,要自己手动释放这些指针


代码在

https://github.com/aerror2/FbxsdkJNI



使用例子:


private long createSkeletonNode(long pScene, String name, long mt,
			double size, int type) {
		long lpSkeleton = FbxSkeleton.Create(pScene, name);
		FbxSkeleton.SetSkeletonType(lpSkeleton, type);
		FbxSkeleton.mepSetSize(lpSkeleton, size);

		long lSkeletonNode = FbxNode.Create(pScene, name);
		FbxNode.SetNodeAttribute(lSkeletonNode, lpSkeleton);

		long t = FbxAMatrix.GetT(mt);
		long r = FbxAMatrix.GetR(mt);
		long s = FbxAMatrix.GetS(mt);

		FbxNode.mepSetLclTranslation(lSkeletonNode, t);
		FbxNode.mepSetLclRotation(lSkeletonNode, r);
		FbxNode.mepSetLclScaling(lSkeletonNode, s);

		FbxVector4.meDestroy(t);
		FbxVector4.meDestroy(r);
		FbxVector4.meDestroy(s);

		return lSkeletonNode;
	}

	test()
	{

 		 long mgr = FbxJnimgr.meCreate();
		  
		  long lpScene = FbxJnimgr.GetScene(mgr);
		
		  long lpMesh = createFbxMesh(mgr,lpScene,meshData);
		  
		  long famt = FbxAMatrix.meCreate();
			FbxAMatrix.SetTRS(famt, t1, r1, s1);

    	
		  
		  long lpRootNode = FbxScene.GetRootNode(lpScene);
		    
          
          long  lSklNode = createSkeletonNode(pScene, n, famt, 100.0, FbxSkeleton.EType.eRoot);
          FbxNode.AddChild(lpRootNode, lSklNode);  

          FbxJnimgr.SaveScene(mgr, lpScene, outputfileNanme);
          FbxJnimgr.meDestroy(mgr);
    }