SlideShare a Scribd company logo
JNI 使用淺談
阿胖 2016.09.29
Android Taipei
Outline
1. Java call c
2. c call java
3. c vs cpp
4. Data Type Mapping
5. Data Type Convert
6. JNIEnv
Java call c
HelloJni.java
hello-jni.c
HelloJni.java
public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}
hello-jni.c
jtype Java_PATH_NAME_CLASSNAME_FUNCTIONNAME(
JNIEnv* env, jobject thiz [,… jparams] )
hello-jni.c
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
char msg[] = "Hello World from JNI !";
jstring jMsg = (*env)->NewStringUTF(env, msg);
return jMsg;
}
c call java
HelloJni.java
hello-jni.c
HelloJni.java
private void callFromJni(String msg) {
Log.i(TAG,"123 "+msg);
}
hello-jni.c
NativeType Call<type>Method(JNIEnv *env, jobject obj, jmethodID methodID, ...);
NativeType Call<type>MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
NativeType Call<type>MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jmethodID GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
jclass GetObjectClass(JNIEnv *env, jobject obj);
hello-jni.cpp
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) {
char msg[] = "Hello World from JNI !";
jstring jMsg = env->NewStringUTF(msg);
return jMsg;
}
jclass jClass = env->GetObjectClass(thiz);
jmethodID mid = env->GetMethodID(jClass, "callFromJni", "(Ljava/lang/String;)V" );
env->CallVoidMethod(thiz, mid, jMsg);
c vs cpp
jstring jMsg = (*env)->NewStringUTF(env, msg);
jstring jMsg = env->NewStringUTF(msg);
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
Data Type Mapping
Java primitive data type Native primitive data type Description
void void None
byte jbyte 8-bit signed. Range is -2^7 to 2^7 - 1
int jint 32-bit signed. Range is -2^31 to 2^31 - 1
float jfloat 32 bits. Represent a real number as small as 1.4 x 10-45
and as big as 3.4 x 1038 (approx.), positive or negative
double jdouble 64 bits. Represent a real number as small as 4.9 x 10-324
and as big as 1.7 x 10308 (approx.), positive or negative
char jchar 16-bit unsigned. Range is 0 to 65535
long jlong 64-bit signed. Range -2^63 to 2^63 - 1
short jshort 16-bit signed. Range is -2^15 to 2^15 - 1
boolean jboolean Unsigned 8 bits. true and false
Data Type Mapping
Java Reference type JNI type Description
java.lang.object jobject Any Java object
java.lang.String jstring String representation
java.lang.Class jclass Java class object
java.lang.Throwable jthrowable Java throwable object
Data Type Mapping
Type Signature Java Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
V void
[ []
L<packet>/object; object
Data Type Mapping
Function in java signature
int foo() “()I”
void foo(byte[] arg) “([B)V”
boolean foo(String arg) “(Ljava/lang/String;)Z”
"(parameterFieldDescriptor)returnFieldDescriptor"
Data Type Convert
NewStringUTF
jstring NewStringUTF(JNIEnv *env, const char *bytes);
jstring jstr = (*env)->NewStringUTF(env, "This comes from jni.");
GetStringUTFChars
const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);
const char* str = (*env)->GetStringUTFChars(env, jstr , NULL);
ReleaseStringUTFChars
void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf);
String
Data Type Convert
New<PrimitiveType>Array Routines
ArrayType New<PrimitiveType>Array(JNIEnv *env, jsize length);
Set<PrimitiveType>ArrayRegion Routines
void Set<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array,
jsize start, jsize len, const NativeType *buf);
Array
Data Type Convert
Get<PrimitiveType>ArrayElements Routines
NativeType *Get<PrimitiveType>ArrayElements(JNIEnv *env,
ArrayType array, jboolean *isCopy);
Release<PrimitiveType>ArrayElements Routines
void Release<PrimitiveType>ArrayElements(JNIEnv *env,
ArrayType array, NativeType *elems, jint mode);
Get<PrimitiveType>ArrayRegion Routines
void Get<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array,
jsize start, jsize len, NativeType *buf);
Array
Data Type Convert
struct{
char name[256];
int num;
} Foo;
Object
class Foo {
public String name;
public int num;
}
Data Type Convert
FindClass
jclass FindClass(JNIEnv *env, const char *name);
“your/java/path/name/class_name$inner_class_name”
jmethodID mid = env->GetMethodID(msgClass, "<init>", "()V" );
NewObject
jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
GetFieldID
jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
Set<type>Field Routines
void Set<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value);
Get<type>Field Routines
Object
Data Type Convert
NewGlobalRef
jobject NewGlobalRef(JNIEnv *env, jobject obj);
DeleteGlobalRef
void DeleteGlobalRef(JNIEnv *env, jobject globalRef);
DeleteLocalRef
void DeleteLocalRef(JNIEnv *env, jobject localRef);
static_cast<type>
JNIEnv
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
LOGI("JNI_OnLoad");
JNIEnv* env = NULL;
jint result = -1;
if(vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) {
return result;
}
jvm = vm;
return JNI_VERSION_1_4;
}
JNIEnv* getJNIEnv() {
JNIEnv* env = NULL;
int res = jvm->GetEnv((void**)&env, JNI_VERSION_1_4);
if (res == JNI_EDETACHED) {
//LOGI("GetEnv: not attached");
if (jvm->AttachCurrentThread(&env, NULL) != 0) {
LOGI("Failed to attach");
return NULL;
}
} else if (res == JNI_OK) {
//
} else if (res == JNI_EVERSION) {
LOGI("GetEnv: version not supported");
return NULL;
}
return env;
}
JNIEnv
JNIEnv* env = getJNIEnv();
/* do something */
jvm->DetachCurrentThread();
Reference
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html
http://www.developer.com/java/data/jni-data-type-mapping-to-cc.html
source code : https://github.com/kentpon/hello-jni
QA

More Related Content

PDF
Learn You a Frege for Great Good!
y_taka_23
 
PDF
ConFess Vienna 2015 - Metaprogramming with Groovy
Iván López Martín
 
ODP
AST Transformations at JFokus
HamletDRC
 
PDF
Object Calisthenics em Go
Elton Minetto
 
PPT
Advanced Javascript
Adieu
 
PPT
Basic Javascript
Bunlong Van
 
PPT
Project Coin
Balamurugan Soundararajan
 
PPTX
Javascript
Gita Kriz
 
Learn You a Frege for Great Good!
y_taka_23
 
ConFess Vienna 2015 - Metaprogramming with Groovy
Iván López Martín
 
AST Transformations at JFokus
HamletDRC
 
Object Calisthenics em Go
Elton Minetto
 
Advanced Javascript
Adieu
 
Basic Javascript
Bunlong Van
 
Javascript
Gita Kriz
 

What's hot (20)

PPTX
Advanced JavaScript
Nascenia IT
 
PDF
Prototype
Aditya Gaur
 
ODP
Groovy Ast Transformations (greach)
HamletDRC
 
PPT
Java 7
Bipul Sinha
 
PPT
JDK1.7 features
india_mani
 
PPTX
Making Java more dynamic: runtime code generation for the JVM
Rafael Winterhalter
 
PPTX
classes & objects in cpp overview
gourav kottawar
 
PPT
Advanced JavaScript
Stoyan Stefanov
 
PDF
The many facets of code reuse in JavaScript
Leonardo Borges
 
PDF
Anonymous functions in JavaScript
Mohammed Sazid Al Rashid
 
PDF
Java objects on steroids
Romain Rochegude
 
PDF
Advanced javascript
Doeun KOCH
 
PDF
What can be done with Java, but should better be done with Erlang (@pavlobaron)
Pavlo Baron
 
PDF
TWINS: OOP and FP - Warburton
Codemotion
 
PDF
What’s new in Kotlin?
Squareboat
 
PDF
(5) cpp abstractions essential_operators
Nico Ludwig
 
PDF
科特林λ學
彥彬 洪
 
PDF
Java 8
Robert Bachmann
 
PDF
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
hwilming
 
PDF
Assignment.1
ashish61_scs
 
Advanced JavaScript
Nascenia IT
 
Prototype
Aditya Gaur
 
Groovy Ast Transformations (greach)
HamletDRC
 
Java 7
Bipul Sinha
 
JDK1.7 features
india_mani
 
Making Java more dynamic: runtime code generation for the JVM
Rafael Winterhalter
 
classes & objects in cpp overview
gourav kottawar
 
Advanced JavaScript
Stoyan Stefanov
 
The many facets of code reuse in JavaScript
Leonardo Borges
 
Anonymous functions in JavaScript
Mohammed Sazid Al Rashid
 
Java objects on steroids
Romain Rochegude
 
Advanced javascript
Doeun KOCH
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
Pavlo Baron
 
TWINS: OOP and FP - Warburton
Codemotion
 
What’s new in Kotlin?
Squareboat
 
(5) cpp abstractions essential_operators
Nico Ludwig
 
科特林λ學
彥彬 洪
 
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
hwilming
 
Assignment.1
ashish61_scs
 
Ad

Viewers also liked (8)

PDF
Android taipei 2016 03-21.pptx
KentPon Wang
 
DOCX
Android media-chapter 23
Dr. Ramkumar Lakshminarayanan
 
PDF
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
Омские ИТ-субботники
 
PDF
Multimedia on android
Ramesh Prasad
 
PPTX
Android Training (Media)
Khaled Anaqwa
 
PDF
ExoPlayer for Application developers
Hassan Abid
 
PDF
Android Multimedia Framework
Picker Weng
 
PDF
Android media framework overview
Jerrin George
 
Android taipei 2016 03-21.pptx
KentPon Wang
 
Android media-chapter 23
Dr. Ramkumar Lakshminarayanan
 
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
Омские ИТ-субботники
 
Multimedia on android
Ramesh Prasad
 
Android Training (Media)
Khaled Anaqwa
 
ExoPlayer for Application developers
Hassan Abid
 
Android Multimedia Framework
Picker Weng
 
Android media framework overview
Jerrin George
 
Ad

Similar to JNI 使用淺談 (20)

PPT
Android JNI
Siva Ramakrishna kv
 
PDF
Getting started with the JNI
Kirill Kounik
 
PDF
NDK Primer (AnDevCon Boston 2014)
Ron Munitz
 
PDF
JNI - Java & C in the same project
Karol Wrótniak
 
PDF
Programming JNI
Kunio Murasawa
 
PDF
NDK Primer (Wearable DevCon 2014)
Ron Munitz
 
PDF
Using the Android Native Development Kit (NDK)
DroidConTLV
 
PPTX
Let's talk about jni
Yongqiang Li
 
PDF
Android and cpp
Joan Puig Sanz
 
PDF
Introduction to the Android NDK
BeMyApp
 
PPT
C++ programming with jni
Peter Hagemeyer
 
PPTX
Android ndk
Khiem-Kim Ho Xuan
 
PDF
JNA - Let's C what it's worth
Idan Sheinberg
 
PDF
Using the Android Native Development Kit (NDK)
Xavier Hallade
 
PDF
JNI - Java & C in the same project
Karol Wrótniak
 
PPTX
Using the android ndk - DroidCon Paris 2014
Paris Android User Group
 
PPTX
Advance Android Application Development
Ramesh Prasad
 
PDF
Native code in Android applications
Dmitry Matyukhin
 
PDF
Ola Bini Evolving The Java Platform
deimos
 
PPTX
Native development kit (ndk) introduction
Rakesh Jha
 
Android JNI
Siva Ramakrishna kv
 
Getting started with the JNI
Kirill Kounik
 
NDK Primer (AnDevCon Boston 2014)
Ron Munitz
 
JNI - Java & C in the same project
Karol Wrótniak
 
Programming JNI
Kunio Murasawa
 
NDK Primer (Wearable DevCon 2014)
Ron Munitz
 
Using the Android Native Development Kit (NDK)
DroidConTLV
 
Let's talk about jni
Yongqiang Li
 
Android and cpp
Joan Puig Sanz
 
Introduction to the Android NDK
BeMyApp
 
C++ programming with jni
Peter Hagemeyer
 
Android ndk
Khiem-Kim Ho Xuan
 
JNA - Let's C what it's worth
Idan Sheinberg
 
Using the Android Native Development Kit (NDK)
Xavier Hallade
 
JNI - Java & C in the same project
Karol Wrótniak
 
Using the android ndk - DroidCon Paris 2014
Paris Android User Group
 
Advance Android Application Development
Ramesh Prasad
 
Native code in Android applications
Dmitry Matyukhin
 
Ola Bini Evolving The Java Platform
deimos
 
Native development kit (ndk) introduction
Rakesh Jha
 

Recently uploaded (20)

PDF
Top 10 read articles In Managing Information Technology.pdf
IJMIT JOURNAL
 
PPT
Ppt for engineering students application on field effect
lakshmi.ec
 
PDF
EVS+PRESENTATIONS EVS+PRESENTATIONS like
saiyedaqib429
 
PPTX
Information Retrieval and Extraction - Module 7
premSankar19
 
PDF
July 2025: Top 10 Read Articles Advanced Information Technology
ijait
 
PDF
dse_final_merit_2025_26 gtgfffffcjjjuuyy
rushabhjain127
 
PDF
Traditional Exams vs Continuous Assessment in Boarding Schools.pdf
The Asian School
 
PDF
Chad Ayach - A Versatile Aerospace Professional
Chad Ayach
 
PDF
Advanced LangChain & RAG: Building a Financial AI Assistant with Real-Time Data
Soufiane Sejjari
 
PPTX
Victory Precisions_Supplier Profile.pptx
victoryprecisions199
 
PDF
Zero Carbon Building Performance standard
BassemOsman1
 
PDF
JUAL EFIX C5 IMU GNSS GEODETIC PERFECT BASE OR ROVER
Budi Minds
 
PPTX
database slide on modern techniques for optimizing database queries.pptx
aky52024
 
PDF
settlement FOR FOUNDATION ENGINEERS.pdf
Endalkazene
 
PPT
1. SYSTEMS, ROLES, AND DEVELOPMENT METHODOLOGIES.ppt
zilow058
 
PPTX
Tunnel Ventilation System in Kanpur Metro
220105053
 
PDF
67243-Cooling and Heating & Calculation.pdf
DHAKA POLYTECHNIC
 
PDF
top-5-use-cases-for-splunk-security-analytics.pdf
yaghutialireza
 
PDF
Unit I Part II.pdf : Security Fundamentals
Dr. Madhuri Jawale
 
PDF
2025 Laurence Sigler - Advancing Decision Support. Content Management Ecommer...
Francisco Javier Mora Serrano
 
Top 10 read articles In Managing Information Technology.pdf
IJMIT JOURNAL
 
Ppt for engineering students application on field effect
lakshmi.ec
 
EVS+PRESENTATIONS EVS+PRESENTATIONS like
saiyedaqib429
 
Information Retrieval and Extraction - Module 7
premSankar19
 
July 2025: Top 10 Read Articles Advanced Information Technology
ijait
 
dse_final_merit_2025_26 gtgfffffcjjjuuyy
rushabhjain127
 
Traditional Exams vs Continuous Assessment in Boarding Schools.pdf
The Asian School
 
Chad Ayach - A Versatile Aerospace Professional
Chad Ayach
 
Advanced LangChain & RAG: Building a Financial AI Assistant with Real-Time Data
Soufiane Sejjari
 
Victory Precisions_Supplier Profile.pptx
victoryprecisions199
 
Zero Carbon Building Performance standard
BassemOsman1
 
JUAL EFIX C5 IMU GNSS GEODETIC PERFECT BASE OR ROVER
Budi Minds
 
database slide on modern techniques for optimizing database queries.pptx
aky52024
 
settlement FOR FOUNDATION ENGINEERS.pdf
Endalkazene
 
1. SYSTEMS, ROLES, AND DEVELOPMENT METHODOLOGIES.ppt
zilow058
 
Tunnel Ventilation System in Kanpur Metro
220105053
 
67243-Cooling and Heating & Calculation.pdf
DHAKA POLYTECHNIC
 
top-5-use-cases-for-splunk-security-analytics.pdf
yaghutialireza
 
Unit I Part II.pdf : Security Fundamentals
Dr. Madhuri Jawale
 
2025 Laurence Sigler - Advancing Decision Support. Content Management Ecommer...
Francisco Javier Mora Serrano
 

JNI 使用淺談