Lan*_*yen 7 c++ java java-native-interface android android-ndk
我的android项目需要帮助.我想将缓冲区从java传递给jni,我的C++代码将填充数据.然后java将在屏幕上显示它们.我对C++并不熟悉,也不知道如何写入写入缓冲区.
这就是我得到的.在java中
ByteBuffer bb = ByteBuffer.allocateDirect(216);
IssmJni.processBuffer(bb);
Run Code Online (Sandbox Code Playgroud)
本地方法
public static native void processBuffer(ByteBuffer bb);
Run Code Online (Sandbox Code Playgroud)
我不使用jni_onload,所以在C++中没有javah
static void fillBuffer(JNIEnv *env, jclass clazz, jobject buf)
{
double *dBuf = env->GetDirectBufferAddress(env, buf);
}
Run Code Online (Sandbox Code Playgroud)
我被困在这里,我可以做双dbuf吗?或者它必须是一个炭?
我想说我想给这个dbuf写1,2,3,4,5,我该怎么做?我在想dbuf.put(1); ... dbuf.put(5)但它不起作用.在填充之后,我只是在java中调用bb.get(position)吗?
有人为我澄清这个,例如将不胜感激谢谢
这是我的原生方法表
static JNINativeMethod method_table [] = {
{"fac" , "(J)J" , (void *) factorial},
{"getBuffer", "()[D" , (void *) getBufferNative},
//{"processBuffer", "(Ljava/nio/ByteBuffer)V", (void *) fillBuffer}};
Run Code Online (Sandbox Code Playgroud)
除了最后一个之外,其他两个工作正常.
我不使用jni_onload,所以在C++中没有javah
这可能与您的问题无关,但您必须做一个或另一个.您需要在onLoad函数中执行Java-to-Native方法映射,或者使用javah生成JNI可以在运行时获取的方法签名.否则,永远不会调用您的本机方法.
但是,如果正确调用了本机方法,那么无论你做什么都可能没问题.
我被困在这里,我可以做双dbuf吗?或者它必须是一个炭?
函数的返回值实际上是a void*,因此您可以将其转换为您想要的任何指针类型,因为它只是一个内存地址.但是,直接缓冲区的实际数据类型将jbyte是typedef signed char,因此以下可能是最佳的:
jbyte *dBuf = env->GetDirectBufferAddress(env, buf);
Run Code Online (Sandbox Code Playgroud)
我想说我想给这个dbuf写1,2,3,4,5,我该怎么做?
C/C++中用于访问数组中值的符号是[]符号,即:
jbyte *dBuf = env->GetDirectBufferAddress(env, buf);
dBuf[0] = 63;
dBuf[1] = 127;
// ...and so on...
Run Code Online (Sandbox Code Playgroud)
在填充之后,我只是在java中调用bb.get(position)吗?
是的,您可以使用ByteBuffer访问器方法访问您从本机代码编写的数据.