1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
| #include <jni.h>
#include <stdio.h>
#include "Java2C.h"
JNIEXPORT jdouble JNICALL Java_Java2C_average
(JNIEnv *env, jobject thisObj, jint n1, jint n2) {
jdouble result;
printf("In C, the numbers are %d and %d\n", n1, n2);
result = ((jdouble)n1 + n2) / 2.0;
return result;
}
JNIEXPORT jstring JNICALL Java_Java2C_sayHello
(JNIEnv *env, jobject thisObj, jstring inJNIStr) {
const char *inCStr = (*env)->GetStringUTFChars(env, inJNIStr, NULL);
if (NULL == inCStr) return NULL;
printf("In C, the receiving string is: %s\n", inCStr);
(*env)->ReleaseStringUTFChars(env, inJNIStr, inCStr);
char outCStr[128] = "Out string from C";
return (*env)->NewStringUTF(env, outCStr);
}
JNIEXPORT jdoubleArray JNICALL Java_Java2C_sumAndAverage
(JNIEnv *env, jobject thisObj, jintArray inJNIArray) {
jint *inCArray = (*env)->GetIntArrayElements(env, inJNIArray, NULL);
if (NULL == inCArray) return NULL;
jsize length = (*env)->GetArrayLength(env, inJNIArray);
jint sum = 0;
int i;
for (i = 0;i<length;i++) {
sum += inCArray[i];
}
jdouble average = (jdouble)sum / length;
(*env)->ReleaseIntArrayElements(env, inJNIArray, inCArray, 0);
jdouble outArray[] = {sum, average};
jdoubleArray outJNIArray = (*env)->NewDoubleArray(env, 2);
if (NULL == outJNIArray) return NULL;
(*env)->SetDoubleArrayRegion(env, outJNIArray, 0, 2, outArray);
return outJNIArray;
}
JNIEXPORT jobjectArray JNICALL Java_Java2C_num2Str
(JNIEnv *env, jobject thisObj, jintArray inJNIArray) {
jobjectArray ret;
jint *inCArray = (*env)->GetIntArrayElements(env, inJNIArray, NULL);
if (NULL == inCArray) return NULL;
jsize length = (*env)->GetArrayLength(env, inJNIArray);
char cStrArray[6][128];
int i;
for (i = 0;i < length; i++) {
snprintf(cStrArray[i], 128, "%d", inCArray[i]);
}
jclass strClass = (*env)->FindClass(env, "java/lang/String");
ret = (*env)->NewObjectArray(env, length, strClass,
(*env)->NewStringUTF(env, ""));
for (i=0;i<length;i++) {
(*env)->SetObjectArrayElement(env, ret, i,
(*env)->NewStringUTF(env, cStrArray[i]));
}
return ret;
}
JNIEXPORT void JNICALL Java_Java2C_modifyJavaVariable
(JNIEnv *env, jobject thisObj) {
jclass thisClass = (*env)->GetObjectClass(env, thisObj);
jfieldID fidNumber = (*env)->GetFieldID(env, thisClass, "number", "I");
if (NULL == fidNumber) return;
jint number = (*env)->GetIntField(env, thisObj, fidNumber);
printf("In C, thi int is %d\n", number);
number = 99;
(*env)->SetIntField(env, thisObj, fidNumber, number);
jfieldID fidMessage = (*env)->GetFieldID(env, thisClass, "message", "Ljava/lang/String;");
if (NULL == fidMessage) return ;
jstring message = (*env)->GetObjectField(env, thisObj, fidMessage);
const char* cStr = (*env)->GetStringUTFChars(env, message, NULL);
if (NULL == cStr) return ;
printf("In C, the string is %s\n", cStr);
(*env)->ReleaseStringUTFChars(env, message, cStr);
message = (*env)->NewStringUTF(env, "Hello from C");
if (NULL == message) return ;
(*env)->SetObjectField(env, thisObj, fidMessage, message);
jfieldID fidSpeed = (*env)->GetStaticFieldID(env, thisClass, "speed", "D");
if (NULL == fidSpeed) return ;
jdouble speed = (*env)->GetStaticDoubleField(env, thisClass, fidSpeed);
printf("In C, the speed is %f\n", speed);
speed = 77.99;
(*env)->SetStaticDoubleField(env, thisClass, fidSpeed, speed);
}
JNIEXPORT void JNICALL Java_Java2C_testCallbackMethod
(JNIEnv *env, jobject thisObj) {
jclass thisClass = (*env)->GetObjectClass(env, thisObj);
jmethodID midCallback = (*env)->GetMethodID(env, thisClass, "callback", "(Ljava/lang/String;)V");
if (NULL == midCallback) return ;
printf("In C, call back Java's callback(String)\n");
jstring message = (*env)->NewStringUTF(env, "Hello from C");
(*env)->CallVoidMethod(env, thisObj, midCallback, message);
jmethodID midCallbackAverage = (*env)->GetMethodID(env, thisClass, "callbackAverage", "(II)D");
if (NULL == midCallbackAverage) return ;
printf("In C, call back Java's callbackAverage\n");
jdouble average = (*env)->CallDoubleMethod(env, thisObj, midCallbackAverage, 2, 3);
printf("In C, the average is %f\n", average);
jmethodID midCallbackStatic = (*env)->GetStaticMethodID(env, thisClass, "callbackStatic", "()Ljava/lang/String;");
if (NULL == midCallbackStatic) {
printf("1111\n");
return ;
}
jstring resultJNIStr = (*env)->CallStaticObjectMethod(env, thisClass, midCallbackStatic);
if (NULL == resultJNIStr) return ;
const char* resultCStr = (*env)->GetStringUTFChars(env, resultJNIStr, NULL);
if (NULL == resultCStr) return;
printf("In C, the returned string is %s\n", resultCStr);
}
|