Q4:JNI 利用した新規コンポーネントで行き詰っています。
Q4-1: 2つの整数から大きい方を返す関数を利用したアプリを構築しようとしています。
まず、JNIを利用せずに、2つの整数から大きい方を返す関数(↓)を新規コンポーネントとして開発して、
public int getMax(int val1, int val2){
int max_val = val1;
if (val2 > val1) max_val = val2;
return max_val;
}
MZPF上で正常に動作するアプリを構築するのに成功しました。
つぎに、JNIを利用して、2つの整数から大きい方を返す関数(↓)を新規コンポーネントとして開発して、
public int getMax(int val1, int val2){
int result = maxValue(val1, val2);
return result;
}
private native int maxValue(int val1, int val2);
MZPF上で同様のアプリを構築すると、アプリ実行時にエラーが発生します。
関連ファイル「実行時エラー.png」。この原因が分からず行き詰っています。
C:\MZPlatform\2.1\lib\sample.dll
C:\MZPlatform\2.1\jars\NativeMaxValue.jar
もちゃんとありますし、ビルダ起動時のメッセージを見ても問題なさそうです。
関連ファイル:buildNativeMaxValue.bat、実行時エラー.png、ビルダ起動時コンソール.png、samples_NativeMaxValue.h、samples_NativeMaxValue.c、NativeMaxValue.java
A4-1:
@Cファイルコンパイル時のファイル名、およびAsamples_NativeMaxValue.cの関数処理の記述に誤りがあります。
@Cファイルのファイル名
buildNativeMaxValue.batの最終行が次のようになっています。
cl /LD /O2 /I% ... src_native\samples_SampleNativeAdditionComponent.c
samples_SampleNativeAdditionComponent.cではなく、正しくはsamples_NativeMaxValue.cと思われます。
A samples_NativeMaxValue.cの関数処理の記述
Java側で定義したメソッドの引数と返り値がintでも、ネイティブ側ではjintになっていますので、ネイティブ側で使用する変数もjintで宣言しないと型キャストが発生してしまいます。(jintの宣言をインクルードファイルでたどると実体はlongのようです)下記のように変数をjintで宣言してお試しください。
JNIEXPORT jint JNICALL Java_samples_NativeMaxValue_maxValue
(JNIEnv *env, jobject obj, jint val1, jint val2)
{
jint max_val = val1;
if (val2 > val1) max_val = val2;
return max_val;