2016-05-06 6 views
2

次の問題に直面しました。私はbyte[] (jbyteArray)で何もできません。 JNIで配列を操作するすべての関数は、JNI DETECTED ERROR IN APPLICATION: jarray argument has non-array typeを引き起こします。私のコードに何が問題なのですか?JNI:配列の長さを取得できません

C:

#include <stdio.h> 
#include <jni.h> 

static jstring convertToHex(JNIEnv* env, jbyteArray array) { 
    int len = (*env)->GetArrayLength(env, array);// cause an error; 
    return NULL; 
} 

static JNINativeMethod methods[] = { 
    {"convertToHex", "([B)Ljava/lang/String;", (void*) convertToHex }, 
}; 

JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) 
{ 
    JNIEnv* env = NULL; 

    if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) { 
     return -1; 
    } 

    jclass cls = (*env)->FindClass(env, "com/infomir/stalkertv/server/ServerUtil"); 

    (*env)->RegisterNatives(env, cls, methods, sizeof(methods)/sizeof(methods[0])); 

    return JNI_VERSION_1_4; 
} 

ServerUtil:

public class ServerUtil { 

    public ServerUtil() { 
     System.loadLibrary("shadow"); 
    } 

    public native String convertToHex(byte[] array); 
} 

主な活動:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ServerUtil serverUtil = new ServerUtil(); 
     byte[] a = new byte[]{1,2,3,4,5}; 
     String s = serverUtil.convertToHex(a); 
    } 
} 

私の環境:

  • のAndroid Studioの2.0
  • 実験のGradleプラグイン0.7.0
  • JAVA 1.8
  • NDK R11B
  • のWindows 10のx64事前に

ありがとう!

答えて

3

ファンクションに渡される2番目の引数は、 a jbyteArrayではありません。 JNI documentation当たり

、ネイティブ関数に渡される引数は、次のとおり

ネイティブメソッドの引数

JNIインタフェースポインタは、ネイティブメソッドの最初の引数です。 JNIインタフェースポインタの型はJNIEnvです。 2番目の引数は、ネイティブメソッドが静的か非静的かによって、 が異なります。非定常ネイティブメソッドの第2引数は、 オブジェクトへの参照です。静的なネイティブメソッドの2番目の引数は、そのJavaクラスへの参照 です。

残りの引数は、通常のJavaメソッドの引数に対応します。 ネイティブメソッド呼び出しは、戻り値を介してその結果を呼び出し側ルーチン に戻します。あなたのjstring convertToHex(JNIEnv* env, jbyteArray array)

は、第二jclassjobject引数が不足しているので、あなたはjobjectまたはjclass引数とjbyteArrayのいずれかを治療しています。

1

ネイティブメソッドの署名が正しくありません。それは

static jstring convertToHe(JNIEnv *env, jobject thiz, jbytearray array) 
です。
関連する問題