前提・実現したいこと
AndroidStudioでJavaからJNIへint配列を渡して値を一つずつ使いたいのですが、ループを使用すると2回目から配列が壊れてしまいます。
ポインタや配列の使い方が間違っているのでしょうか?
発生している問題・エラーメッセージ
JNIでポインタから配列への値コピーで、ループの2回目以降は下記エラーになってしまいます。
read memory from 0x1 failed (0 of 4 bytes read)
再現可能なソースコード
プロジェクトの作成に従って作成し、Javaからint配列をJNIへ送る様に変更しました。
Java
1public class MainActivity extends AppCompatActivity { 2 static { 3 System.loadLibrary("native-lib"); 4 } 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 int[] intValues = new int[10]; 12 for(int i=0; i < 10; i++) 13 intValues[i] = i+1; // 1~10を入れる 14 15 TextView tv = findViewById(R.id.sample_text); 16 tv.setText(stringFromJNI(intValues)); 17 } 18 19 public native String stringFromJNI(int[] ints); 20} 21
JNI
1#include <jni.h> 2#include <string> 3 4extern "C" JNIEXPORT jstring JNICALL 5Java_s_glc_cpptestplus_MainActivity_stringFromJNI( 6 JNIEnv *env, 7 jobject /* this */, 8 jintArray intValues 9 ) { 10const jint intLength = env->GetArrayLength(intValues); 11 jint *intValuesCpp = env->GetIntArrayElements(intValues, 0); 12 13 int intDat[intLength]; 14// for(int i=0;i<intLength ;i++) 15// intDat[i] = 0; 16 17/* 18 intDat[0] = intValuesCpp[0]; 19 intDat[1] = intValuesCpp[1]; 20 intDat[2] = intValuesCpp[2]; 21 intDat[3] = intValuesCpp[3]; 22 intDat[4] = intValuesCpp[4]; 23 intDat[5] = intValuesCpp[5]; 24 intDat[6] = intValuesCpp[6]; 25 intDat[7] = intValuesCpp[7]; 26 intDat[8] = intValuesCpp[8]; 27 intDat[9] = intValuesCpp[9]; 28*/ 29 for(int i = 0;i < intLength;i++) 30 intDat[i] = intValuesCpp[i]; 31 32 std::string strValues = ""; 33 for(int i = 0;i < intLength;i++) 34 strValues += intDat[i]; 35 36 37 env->ReleaseIntArrayElements(intValues, intValuesCpp,false); 38 std::string hello = "Hello from C++" + strValues; 39 return env->NewStringUTF(hello.c_str()); 40}
app
1 buildTypes { 2 debug{ 3 debuggable true 4 minifyEnabled false 5 } 6 release { 7 minifyEnabled false 8 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 9 } 10 } 11 externalNativeBuild { 12 cmake { 13 path "src/main/cpp/CMakeLists.txt" 14 version "3.10.2" 15 } 16 } 17} 18 19dependencies { 20 implementation fileTree(dir: 'libs', include: ['*.jar']) 21 implementation 'androidx.appcompat:appcompat:1.1.0' 22 implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 23 testImplementation 'junit:junit:4.13' 24 androidTestImplementation 'androidx.test.ext:junit:1.1.1' 25 androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 26}
試したこと
JNI
1 intDat[0] = intValuesCpp[0]; // intDat[0]に1が入る 2 intDat[1] = intValuesCpp[1]; // intDat配列が「parent failed to evaluate: variable not available」になる 3 intDat[2] = intValuesCpp[2]; 4 intDat[3] = intValuesCpp[3]; 5 intDat[4] = intValuesCpp[4]; 6 intDat[5] = intValuesCpp[5]; 7 intDat[6] = intValuesCpp[6]; 8 intDat[7] = intValuesCpp[7]; 9 intDat[8] = intValuesCpp[8]; 10 intDat[9] = intValuesCpp[9];
補足情報(FW/ツールのバージョンなど)
Windows10
AndroidStudio 3.5.3
回答1件
あなたの回答
tips
プレビュー