Tag: jni

如何在C ++代码中保留C ++对象? 可能?

首先,我有一个遗留的C ++库,我正在使用新的UI将我的应用程序迁移到Android。 在运行时期间,可能会动态创建和销毁多个C ++对象。 我构建了一组JNI本机方法来调用库来实现它。 但是我应该在哪里保留这些C ++对象? 如果不必要,我必须跟踪它们并释放它们。 到目前为止,我只知道Java无法引用C ++对象。 是否有可能创建一个包含对C ++对象的引用的Java包装器类? 谢谢。

使用SWIG和C ++的std :: map时没有Java的迭代器

我已经在C ++中实现了一个带有std::map的类,并使用SWIG创建了从Java调用的接口。 但是没有迭代器对象允许我遍历SWIG包装的std::map的条目。 有谁知道如何创建迭代器?

从Java存储中检索未知长度的字节数组

我已经发布了一个关于它的问题,但那时我还没有账号。 我得到了答复,但我仍然感到困惑,我不能继续这个post。 我将再次发布问题以及之前对话的链接。 将char数组从java返回到字符串 – JNI 我用Java存储的数据是序列化的。 我使用下面的代码进行java函数调用。 下面的代码假定C的char与Java的字节兼容,因为Java的char是2字节而C的char是1字节。 jbyte也是一个签名的字符* //value will be the serialized data void store(char* key, char* value, int val_len) { //consider the jclass and methodid are already initialized jstring j_key = (*env)->NewStringUTF(env, key); jbyteArray j_value = (*env)->NewByteArray(env, val_len); (*env)->SetByteArrayRegion(env, j_value, 0, val_len, (jbyte *)value); //The store method on java side will […]

从.NET调用Java API – 最好的方法

我需要从现有的.NET代码库中调用java中的所有API。 这里最好的方法是什么? 在java中编写一个web服务,基本上只是将调用转发给API – 或者像JNI4NET这样的东西 ?

何时以及如何释放NIO直接缓冲区?

我有一个C库,需要一个临时缓冲区用于临时空间。 我正在考虑将直接字节缓冲区的地址传递给它。 是否允许VM在最终释放缓冲区之前重新定位缓冲区? 在JNI帧消失后,本机库将保持指针。 我的理解是无法缓存JNI本地对象引用,因为VM可能在GC期间重定位它们。 这适用于缓冲区地址吗? 据我所知,如果我在Java中分配缓冲区然后让缓冲区对象超出范围,VM将释放缓冲区内存。 如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,它的职责是释放后备内存? 如果我使用NewDirectByteBuffer在本机代码中创建一个新缓冲区并且直接缓冲区已经使用了一个地址,会发生什么? 记忆会被双重释放吗? VM引用是否会计算内存块,并在引用它的最后一个缓冲区被垃圾收集时尝试释放它?

GC中的GC.AddMemoryPressure等效

项目:Java,JNI(C ++),Android。 我将通过创建一个托管包装类来管理本机C ++对象的生命周期,该类包含一个指向本机对象的指针(作为一个长成员),并将删除其中重写的finalize()方法中的本机对象。 有关详细信息,请参阅此问 C ++对象不消耗其他类型的资源,只消耗内存。 对象的内存占用量不是很高,但它基本上高于Java中64位的长度。 有没有办法告诉Java的GC,我的包装器不仅仅是一个很长的值,而且在运行垃圾收集之前创建数百万个这样的对象并不是一个好主意? 在.NET中有一个GC的AddMemoryPressure ()方法,正是出于这个目的。 Java中是否存在等价物?

如何在Java中存储映射(mmap)linux块设备(例如/ dev / sdb)?

我可以使用java.nio读取/编写带有Java的linux块设备。 以下代码有效: Path fp = FileSystems.getDefault().getPath(“/dev”, “sdb”); FileChannel fc = null; try { fc = FileChannel.open(fp, EnumSet.of(StandardOpenOption.READ, StandardOpenOption.WRITE)); } catch (Exception e) { System.out.println(“Error opening file: ” + e.getMessage()); } ByteBuffer buf = ByteBuffer.allocate(50); try { if(fc != null) fc.write(buf); } catch (Exception e) { System.out.println(“Error writing to file: ” + e.getMessage()); } 但是,内存映射不起作用。 以下代码失败 […]

如何处理从C ++通过SWIG到Java的exception

我们正在实现一个关于C ++代码的包装器,以便接触Java客户端。 我已经看到了关于exception处理的SWIG文档,但这在三层(C ++ / SWIG / Java)中的编码术语中转化了什么? 如果有人有工作实例或建议,我将不胜感激。

C ++ std :: string到jstring,长度固定

我正在尝试将C ++ std :: string转换为jstring并返回它。 这很容易 JNIEnv*->NewStringUTF(stdString.c_str()) 但问题是我正在转换的字符串几乎随机散布了空字符。 这是c_str()的问题,但不是std::string 。 NewStringUTF只捕获完整std::string 。 有一些希望, std::string有一个length()函数,它获取全长,忽略有问题的char * \0字符。 有一个单独的函数NewString ,它接受一个jchar *和一个jsize *,所以看起来很有希望,但我无法将std :: string正确转换为jchar *。 我试过把它变成一个字节数组,但我可能做得不对。 我有进一步的问题,将length()给出的int转换为jsize,这是NewString调用所需要的。 我已经使用vector byteArray(stdString.begin(), stdString.end())完成了一些工作,但这并没有让我走得太远,可能是因为这弄乱了原始字符串是什么。 这是我的基本入门函数,它使用没有空字符的字符串: jstring StringToJString(JNIEnv * env, const std::string & nativeString) { return env->NewStringUTF(nativeString.c_str()); } 作为旁注,此函数在JNI包装器文件中用于返回对象的std::string 。 感谢您的帮助或信息来源!

如何将JNI C#类传递给Java或处理这种情况?

我试图从C#调用Java方法,它从java中调用如下: EgamePay.pay(thisActivity, payAlias, new EgamePayListener() { @Override public void paySuccess(String alias) { } @Override public void payFailed(String alias, int errorInt) { } @Override public void payCancel(String alias) { } }); 前两个参数都可以,但是如何在C#中传递EgamePayListner? 简单地创建具有相同function的C#类将无法正常工作…… 这是我目前正在做的事情: using (AndroidJavaClass jc = new AndroidJavaClass(“cn.egame.terminal.smspay.EgamePay”)) { System.IntPtr cls_Activity = AndroidJNI.FindClass(“com/unity3d/player/UnityPlayer”); System.IntPtr fid_Activity = AndroidJNI.GetStaticFieldID(cls_Activity, “currentActivity”, “Landroid/app/Activity;”); object[] p = { fid_Activity, […]