我有一个使用JNI(使用NDK)在Java和C / C ++中进行编码的android项目。
我在Java端创建了一个Jni Java包装器,该包装器将自己完成所有Jni操作,而除了该包装器之外,没有其他Java类可以直接访问jni操作。
问题是,我希望创建此包装器的多个实例,而Jni部分每个Jni包装器应具有一个实例。
这是一个问题,因为Jni部分对所有实例都具有相同的字段。
我如何解决此问题,以便对于jni包装器的每个java实例,jni部分上都会有一个实例?
我在想,也许我可以将所有字段放入C
++类中,并拥有一个init()函数,该函数将为JniWrapper的CTOR以及从那时开始为需要字段的每个JNI函数返回一个新实例。
,它将获得此类作为参数。可能是此链接上显示的指针。
可悲的是,我不知道该怎么做。
谁能帮忙吗?
这是一个示例代码,希望对那些不了解该问题的人更加清楚:
Java部分:
public class JniWrapper
{
static
{
System.loadLibrary("JniTest");
}
private native void foo(Bitmap bitmap);
}
jni部分:
...
// sadly, all of those fields are actually a global fields
int _intField;
float _floatField;
//those are just sample fields. i would also like to store pointers and objects...
JNIEXPORT void JNICALL ...foo(JNIEnv * env, jobject obj, jobject bitmap)
{
// do something with the fields, as if they all belong to the JniWrapper,
// and no other instances of JniWrapper are allowed to change them
}
我找到了一个可能的解决方案(在此处链接),可以使用jlong或jobject作为在JNI端创建的对象的句柄(或指针,如果您愿意的话)。
人们说最好使用Jobject作为ByteBuffer而不是jlong以获得更好的兼容性。
解决方案是:
Java方面:
private native ByteBuffer init();
private native void foo(ByteBuffer handle);
JNI端:
/**a class to hold the fields*/
class FieldsHolder
{
... //private fields, for each instance
}
创建JNI对象并发送到Java端:
JNIEXPORT jobject JNICALL ...init(JNIEnv * env, jobject obj)
{
FieldsHolder* myClass= new FieldsHolder();
... //prepare fields of the class
return env->NewDirectByteBuffer(myClass, 0);
}
重用JNI对象:
JNIEXPORT void JNICALL ...foo(JNIEnv * env, jobject obj, jobject handle)
{
FieldsHolder* myClass= (FieldsHolder*) env->GetDirectBufferAddress(handle);
//now we can access the fields again.
}
我们正在探索在Android项目中包含一些现有的C库,并被推荐使用JNI。我看到的大多数参考资料都建议这样做:https://medium.com/@ssarel/create-your-first-jni-Application ation-on-android-with-the-ndk-5f149508fb12,您可以在其中生成本机标头和代码以与Java交互。 假设您不能修改本机库,这仍然是最
问题内容: 所以我在C中使用了Java本机接口的以下代码,但是我想将其转换为C ++,但不确定如何。 Java程序: JNI与C和C ++交互的区别是什么?任何帮助是极大的赞赏。 谢谢,皮特 问题答案: 我曾经有一本书《EssentialJNI》。虽然它有些过时,但今天仍然可以使用。 如果我没记错的话,在C语言中,Java构造只是指针。因此,在您的代码中,“ ”是取消引用指针,以使您可以访问基础方
问题内容: 实际上,我调用了一个c ++函数: JNIEXPORT void JNICALL Java_test_main_JniFunctions_testObject(JNIEnv * env,jobject obj,jobjectArray objArray){....} 我想做的就是找回原始对象的值。考虑此对象的Java代码声明: 例如,从第二列的第三行获取值。 任何人都有一个关于如何做到
我正在制作一个库应用程序,该应用程序使用谷歌断路器检测android中的本机崩溃。每当我的主端发生本机崩溃时,断路器都会调用以下回调。从这个回调中,我需要使用JNI在java类中调用一个静态val方法。 这是我的java方法: 在Android5.0之前,这一功能一直运行良好。但在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部句柄异常”日志。 以下是我在
我想比较两个jbyteArray如果在JNI中相等的话。有没有像“strcmp”这样的方法?
问题内容: 我想做类似于“和”过滤器示例的操作,除了每个示例中都带有“应该”的术语,而不是示例中的字段类型。我提出以下内容: 但是,我收到此错误: 还有另一种方法可以执行我正在尝试执行的操作,还是我走在正确的轨道上?还是在Elasticsearch中这是不可能的? 问题答案: 每个布尔查询子句可以包含多个子句。字词查询(http://www.elasticsearch.org/guide/refe