Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AndroidJNI从Java类中获得两个字段_Java_Android_C++_Android Ndk - Fatal编程技术网

AndroidJNI从Java类中获得两个字段

AndroidJNI从Java类中获得两个字段,java,android,c++,android-ndk,Java,Android,C++,Android Ndk,在我发布任何代码或任何东西之前,让我解释一下我试图实现的目标: 我要做的是从资产文件夹中获取加载着色器,并将一个数组< PongDroidShader < /Cord>对象传递给C++,以便编译和加载它们。p> 在我的Java类中,我有一个函数,它遍历shaders文件夹中的每个着色器文件并对其进行解析,然后将其加载到字符串对象中,同时还通过其文件扩展名(例如,顶点将具有.vert扩展名)检查着色器类型。完成后,我会将其发送到本机的编译器阅读器函数,该函数会获取PongDroidShader对

在我发布任何代码或任何东西之前,让我解释一下我试图实现的目标: 我要做的是从资产文件夹中获取加载着色器,并将一个数组< <代码> PongDroidShader < /Cord>对象传递给C++,以便编译和加载它们。p> 在我的Java类中,我有一个函数,它遍历shaders文件夹中的每个着色器文件并对其进行解析,然后将其加载到
字符串
对象中,同时还通过其文件扩展名(例如,顶点将具有
.vert
扩展名)检查着色器类型。完成后,我会将其发送到本机的
编译器阅读器
函数,该函数会获取
PongDroidShader
对象的数组以及数组的大小

之后,我解析并链接来自JNI代码的着色器

到目前为止,我很难让JNI识别Java代码并将其加载到变量中。到目前为止,我掌握的情况如下:

04-25 22:20:56.267 11985 11985 D dalvikvm: Trying to load lib /data/data/com.grepwise.pongdroid/lib/libnativepd.so 0x4051c800
04-25 22:20:56.275 11985 11985 D dalvikvm: Added shared lib /data/data/com.grepwise.pongdroid/lib/libnativepd.so 0x4051c800
04-25 22:20:56.322 11985 11985 D dalvikvm: GetFieldID: unable to find field Lcom/grepwise/pongdroid/PongDroidShader;.mType:ShaderType
04-25 22:20:56.322 11985 11985 D dalvikvm: GetFieldID: unable to find field Lcom/grepwise/pongdroid/PongDroidShader;.mShaderSrc:java/lang/String
04-25 22:20:56.330 11985 11985 I dalvikvm:   at com.grepwise.pongdroid.PongDroid$ShaderHandler.compileShaders(Native Method)
04-25 22:20:56.330 11985 11985 I dalvikvm:   at com.grepwise.pongdroid.PongDroid$ShaderHandler.access$1(PongDroid.java:128)
04-25 22:20:56.330 11985 11985 I dalvikvm:   at com.grepwise.pongdroid.PongDroid.onCreate(PongDroid.java:72)
Java代码

public final class PongDroidShader {
    public String mShaderSrc;
    public ShaderType mType;
}

private class ShaderHandler {


        ...

        private native void compileShaders(PongDroidShader[] shaders, int shaderCount);

        ...
JNIEXPORT void JNICALL Java_com_grepwise_pongdroid_PongDroid_00024ShaderHandler_compileShaders
  (JNIEnv * env, jobject obj, jobjectArray shaders, jint sizeOfShaders) {

    for( int i = 0; i < sizeOfShaders; ++i )
    {
        jclass clazz = env->FindClass( "com/grepwise/pongdroid/PongDroidShader" );
        jclass shaderTypeEnum = env->FindClass( "com/grepwise/pongdroid/ShaderType" );

        jfieldID field = env->GetFieldID( clazz, "mType", "ShaderType" );

        jobject shader = env->GetObjectArrayElement( shaders, i );

        const jchar jShaderChr = env->GetCharField( shader, env->GetFieldID( clazz, "mShaderSrc", "java/lang/String" ) );

        jstring jShaderStr = env->NewString( &jShaderChr, sizeof( jShaderChr ) );

        const char* shaderStr = env->GetStringUTFChars( jShaderStr, 0 );

        //TODO implement GL Shader Manipulation and Allocation here

        optim::Config::Log::info( "Testing shader: %s", shaderStr );

        delete shaderStr;
    }

}
JNI/C++代码

public final class PongDroidShader {
    public String mShaderSrc;
    public ShaderType mType;
}

private class ShaderHandler {


        ...

        private native void compileShaders(PongDroidShader[] shaders, int shaderCount);

        ...
JNIEXPORT void JNICALL Java_com_grepwise_pongdroid_PongDroid_00024ShaderHandler_compileShaders
  (JNIEnv * env, jobject obj, jobjectArray shaders, jint sizeOfShaders) {

    for( int i = 0; i < sizeOfShaders; ++i )
    {
        jclass clazz = env->FindClass( "com/grepwise/pongdroid/PongDroidShader" );
        jclass shaderTypeEnum = env->FindClass( "com/grepwise/pongdroid/ShaderType" );

        jfieldID field = env->GetFieldID( clazz, "mType", "ShaderType" );

        jobject shader = env->GetObjectArrayElement( shaders, i );

        const jchar jShaderChr = env->GetCharField( shader, env->GetFieldID( clazz, "mShaderSrc", "java/lang/String" ) );

        jstring jShaderStr = env->NewString( &jShaderChr, sizeof( jShaderChr ) );

        const char* shaderStr = env->GetStringUTFChars( jShaderStr, 0 );

        //TODO implement GL Shader Manipulation and Allocation here

        optim::Config::Log::info( "Testing shader: %s", shaderStr );

        delete shaderStr;
    }

}

我相信你应该用这个来获得你的领域:

env->GetFieldID( clazz, "mType", "Lcom/grepwise/pongdroid/ShaderType;" );
env->GetFieldID( clazz, "mShaderSrc", "Ljava/lang/String;" )
并将类和字段移出循环

编辑: 还包括:

const jchar jShaderChr = env->GetCharField(...)
从mShaderSrc获取字符串值是错误的

您应该使用:

jstring jShaderStr = (jstring)env->GetObjectField(...);
const char* shaderSrc = env->GetStringUTFChars(jShaderStr, 0);
// ... here use shaderSrc
env->ReleaseStringUTFChars(hShaderStr, shaderSrc);

您必须从实例获取私有字段,并将签名作为第三个参数传递

jfieldID field = env->GetFieldID( obj, "mShaderSrc", "Ljava/lang/String;" );

我解决了这个问题:Eclipse无法识别我的类路径。如果任何人有类似的问题,那么他们需要转到窗口->首选项->Java->构建路径->类路径,并将类路径添加到他们正在使用的Android SDK平台,以及项目的类根路径(例如,
$project\u root/bin/classes
)。

不,这是错误的。GetFieldID引用类,而不是第一个参数中的对象。看这里:不管什么原因,我的clazz没有被认出来。我试过在字符串的开头加一个“L”,但没有。我也试过不用分号。是否有任何原因导致此操作不起作用?是否确定您的ShaderType位于com.grepwise.pngdroid包中?