Array
Static array
- declare array with length but without specific value, and check its length
 
int numbers[3];
#define LENGTH(x)  (sizeof(x) / sizeof((x)[0]))
int length = LENGTH(numbers); 
How do I determine the size of my array in C?
- the static array should declare with the deterministic length.
 
int length = 20;
int numbers[length]; 
constexpr int LENGTH = 20;
int numbers[LENGTH]; 
- declare array with specific value for elements
 
int numbers[10] = {0};
double doubles[10] = {0.0};
char chars[10] = {'\0'};
bool bools[10] = {false};
- declare array with some specific value, others with default
 
int numbers[5] = {0, 1}; 
double doubles[5] = {0.0, 0.1}; 
char chars[5] = {'A', 'B'};
bool bools[5] = {false, true};
- no needs to write length explitly
 
int numbers[] = {1, 2, 3, 4, 5, 6}; 
Dynamic array
- declare without specific value
 
int *numbers = new int[length];
- specify the value when declaration
 
  int length = 2;
  int *numbers = new int[length]{1, 2}; 
Create native array then ask Java to sort
package com.practice
class Lib {
  external fun callNative()
  init {
    System.loadLibrary("native-lib")
  }
}
package com.practice
class Sorter {
  companion object {
    @JvmStatic
    fun sort(list: IntArray) {
      list.sort()
      list.take(10)
        .forEachIndexed { index, num -> println("$index: $num") }
    }
  }
}
package com.hsy.anative
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.practice.Lib
class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    Lib().callNative()
  }
}
#include <jni.h>
#include <android/log.h>
#include <random>
#include <limits>
using namespace std;
constexpr auto TAG = "nativeCode";
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
jintArray cloneToJavaArray(JNIEnv *env, int nativeArray[], int length) {
  jintArray javaArray = env->NewIntArray(length);
  env->SetIntArrayRegion(javaArray, 0, length, nativeArray);
  return javaArray;
}
jclass findClass(JNIEnv *env, const char *name) {
  jclass cls = env->FindClass(name);
  if (cls == nullptr) {
    LOGE("class not found");
  }
  return cls;
}
jmethodID getStaticMethodId(JNIEnv *env, jclass cls, const char *methodName, const char *sig) {
  jmethodID result = env->GetStaticMethodID(cls, methodName, sig);
  if (result == nullptr) {
    LOGE("method id for %s(%s) not found.", methodName, sig);
  }
  return result;
}
void askJavaToSort(JNIEnv *env, int nativeArray[], int length) {
  // clone to Java array
  jintArray javaArray = cloneToJavaArray(env, nativeArray, length);
  // ask Java to sort array
  jclass cls = findClass(env, "com/practice/Sorter");
  env->CallStaticVoidMethod(cls, getStaticMethodId(env, cls, "sort", "([I)V"), javaArray);
  env->GetIntArrayRegion(javaArray, 0, length, nativeArray);
  // release
  env->DeleteLocalRef(cls);
  env->DeleteLocalRef(javaArray);
}
void printArray(int list[], int length) {
  for (int index = 0; index < length; index++) {
    LOGD("native #%d: %d", index, list[index]);
  }
}
void makeRandomNumbers(int nativeArray[], int length) {
  // init random num generator
  random_device rd;
  default_random_engine generator(rd());
  uniform_int_distribution<int> distribution(0, numeric_limits<int>::max());
  // make random number
  for (int index = 0; index < length; index++) {
    nativeArray[index] = distribution(generator);
  }
}
extern "C" JNIEXPORT void JNICALL Java_com_practice_Lib_callNative(JNIEnv *env, jobject) {
  constexpr int LENGTH = 20;
  int numbers[LENGTH] = {0};
  makeRandomNumbers(numbers, LENGTH);
  printArray(numbers, LENGTH);
  // ask Java to sort array
  askJavaToSort(env, numbers, LENGTH);
  printArray(numbers, LENGTH);
}
maximum value of int
Generating a uniform random integer in C++
C++11 內建亂數函式庫使用教學:隨機亂數產生器與機率分布