Skip to content

Instantly share code, notes, and snippets.

@fish2000
Created March 4, 2020 15:04
Show Gist options
  • Save fish2000/8170c62853f1c9f79cb91db2a3ad340e to your computer and use it in GitHub Desktop.
Save fish2000/8170c62853f1c9f79cb91db2a3ad340e to your computer and use it in GitHub Desktop.
JNI Method Signatures
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
2
3
4
5
6
7
8
9
10
11
// Save as "HelloJNI.cc"
#include <jni.h> // JNI header provided by JDK
#include <iostream> // C++ standard IO header
#include "HelloJNI.h" // Generated
using namespace std;
// Implementation of the native method sayHello()
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
cout << "Hello World from C++!" << endl;
return;
}
#include <cstdio>
#include "com_marakana_jniexamples_InstanceAccess.h"
JNIEXPORT void JNICALL Java_com_marakana_jniexamples_InstanceAccess_propertyAccess(JNIEnv *env, jobject object){
jfieldID fieldId;
jstring jstr;
const char *cString;
/* Getting a reference to object class */
jclass class = (*env)->GetObjectClass(env, object); /* 1 */
/* Getting the field id in the class */
fieldId = (*env)->GetFieldID(env, class, "name", "Ljava/lang/String;"); /* 2 */
if (fieldId == NULL) {
return; /* Error while getting field id */
}
/* Getting a jstring */
jstr = (*env)->GetObjectField(env, object, fieldId); /* 3 */
/* From that jstring we are getting a C string: char* */
cString = (*env)->GetStringUTFChars(env, jstr, NULL); /* 4 */
if (cString == NULL) {
return; /* Out of memory */
}
printf("C: value of name before property modification = \"%s\"\n", cString);
(*env)->ReleaseStringUTFChars(env, jstr, cString);
/* Creating a new string containing the new name */
jstr = (*env)->NewStringUTF(env, "Brian"); /* 5 */
if (jstr == NULL) {
return; /* Out of memory */
}
/* Overwrite the value of the name property */
(*env)->SetObjectField(env, object, fieldId, jstr); /* 6 */
}
JNIEXPORT void JNICALL Java_com_marakana_jniexamples_InstanceAccess_methodAccess(JNIEnv *env, jobject object){
jclass class = (*env)->GetObjectClass(env, object); /* 7 */
jmethodID methodId = (*env)->GetMethodID(env, class, "setName", "(Ljava/lang/String;)V"); /* 8 */
jstring jstr;
if (methodId == NULL) {
return; /* method not found */
}
/* Creating a new string containing the new name */
jstr = (*env)->NewStringUTF(env, "Nick"); /* 9 */
(*env)->CallVoidMethod(env, object, methodId, jstr); /* 10 */
}
#include <jni.h>
#include <stdio.h>
#include "TestJNIInstanceVariable.h"
JNIEXPORT void JNICALL Java_TestJNIInstanceVariable_modifyInstanceVariable
(JNIEnv *env, jobject thisObj) {
// Get a reference to this object's class
jclass thisClass = (*env)->GetObjectClass(env, thisObj);
// int
// Get the Field ID of the instance variables "number"
jfieldID fidNumber = (*env)->GetFieldID(env, thisClass, "number", "I");
if (NULL == fidNumber) return;
// Get the int given the Field ID
jint number = (*env)->GetIntField(env, thisObj, fidNumber);
printf("In C, the int is %d\n", number);
// Change the variable
number = 99;
(*env)->SetIntField(env, thisObj, fidNumber, number);
// Get the Field ID of the instance variables "message"
jfieldID fidMessage = (*env)->GetFieldID(env, thisClass, "message", "Ljava/lang/String;");
if (NULL == fidMessage) return;
// String
// Get the object given the Field ID
jstring message = (*env)->GetObjectField(env, thisObj, fidMessage);
// Create a C-string with the JNI String
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);
// Create a new C-string and assign to the JNI string
message = (*env)->NewStringUTF(env, "Hello from C++");
if (NULL == message) return;
// modify the instance variables
(*env)->SetObjectField(env, thisObj, fidMessage, message);
}