• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <iostream>
6 
7 #include "base/android/jni_generator/sample_for_tests.h"
8 
9 #include "base/android/jni_android.h"
10 #include "base/android/jni_string.h"
11 #include "base/android/scoped_java_ref.h"
12 // Generated file for JNI bindings from C++ to Java @CalledByNative methods.
13 // Only to be included in one .cc file.
14 // Name is based on the java file name: *.java -> jni/*_jni.h
15 #include "jni/SampleForTests_jni.h"  // Generated by JNI.
16 
17 using base::android::AttachCurrentThread;
18 using base::android::ConvertJavaStringToUTF8;
19 using base::android::ConvertUTF8ToJavaString;
20 using base::android::ScopedJavaLocalRef;
21 
22 namespace base {
23 namespace android {
24 
MethodOtherP0(JNIEnv * env,const JavaParamRef<jobject> & caller)25 jdouble CPPClass::InnerClass::MethodOtherP0(
26     JNIEnv* env,
27     const JavaParamRef<jobject>& caller) {
28   return 0.0;
29 }
30 
CPPClass()31 CPPClass::CPPClass() {
32 }
33 
~CPPClass()34 CPPClass::~CPPClass() {
35 }
36 
37 // static
Destroy(JNIEnv * env,const JavaParamRef<jobject> & caller)38 void CPPClass::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) {
39   delete this;
40 }
41 
Method(JNIEnv * env,const JavaParamRef<jobject> & caller)42 jint CPPClass::Method(JNIEnv* env, const JavaParamRef<jobject>& caller) {
43   return 0;
44 }
45 
AddStructB(JNIEnv * env,const JavaParamRef<jobject> & caller,const JavaParamRef<jobject> & structb)46 void CPPClass::AddStructB(JNIEnv* env,
47                           const JavaParamRef<jobject>& caller,
48                           const JavaParamRef<jobject>& structb) {
49   long key = Java_InnerStructB_getKey(env, structb);
50   std::string value =
51       ConvertJavaStringToUTF8(env, Java_InnerStructB_getValue(env, structb));
52   map_[key] = value;
53 }
54 
IterateAndDoSomethingWithStructB(JNIEnv * env,const JavaParamRef<jobject> & caller)55 void CPPClass::IterateAndDoSomethingWithStructB(
56     JNIEnv* env,
57     const JavaParamRef<jobject>& caller) {
58   // Iterate over the elements and do something with them.
59   for (std::map<long, std::string>::const_iterator it = map_.begin();
60        it != map_.end(); ++it) {
61     long key = it->first;
62     std::string value = it->second;
63     std::cout << key << value;
64   }
65   map_.clear();
66 }
67 
ReturnAString(JNIEnv * env,const JavaParamRef<jobject> & caller)68 ScopedJavaLocalRef<jstring> CPPClass::ReturnAString(
69     JNIEnv* env,
70     const JavaParamRef<jobject>& caller) {
71   return ConvertUTF8ToJavaString(env, "test");
72 }
73 
74 // Static free functions declared and called directly from java.
JNI_SampleForTests_Init(JNIEnv * env,const JavaParamRef<jobject> & caller,const JavaParamRef<jstring> & param)75 static jlong JNI_SampleForTests_Init(JNIEnv* env,
76                                      const JavaParamRef<jobject>& caller,
77                                      const JavaParamRef<jstring>& param) {
78   return 0;
79 }
80 
JNI_SampleForTests_GetDoubleFunction(JNIEnv *,const JavaParamRef<jobject> &)81 static jdouble JNI_SampleForTests_GetDoubleFunction(
82     JNIEnv*,
83     const JavaParamRef<jobject>&) {
84   return 0;
85 }
86 
JNI_SampleForTests_GetFloatFunction(JNIEnv *,const JavaParamRef<jclass> &)87 static jfloat JNI_SampleForTests_GetFloatFunction(JNIEnv*,
88                                                   const JavaParamRef<jclass>&) {
89   return 0;
90 }
91 
JNI_SampleForTests_SetNonPODDatatype(JNIEnv *,const JavaParamRef<jobject> &,const JavaParamRef<jobject> &)92 static void JNI_SampleForTests_SetNonPODDatatype(JNIEnv*,
93                                                  const JavaParamRef<jobject>&,
94                                                  const JavaParamRef<jobject>&) {
95 }
96 
JNI_SampleForTests_GetNonPODDatatype(JNIEnv *,const JavaParamRef<jobject> &)97 static ScopedJavaLocalRef<jobject> JNI_SampleForTests_GetNonPODDatatype(
98     JNIEnv*,
99     const JavaParamRef<jobject>&) {
100   return ScopedJavaLocalRef<jobject>();
101 }
102 
JNI_InnerClass_GetInnerIntFunction(JNIEnv *,const JavaParamRef<jclass> &)103 static jint JNI_InnerClass_GetInnerIntFunction(JNIEnv*,
104                                                const JavaParamRef<jclass>&) {
105   return 0;
106 }
107 
108 } // namespace android
109 } // namespace base
110 
main()111 int main() {
112   // On a regular application, you'd call AttachCurrentThread(). This sample is
113   // not yet linking with all the libraries.
114   JNIEnv* env = /* AttachCurrentThread() */ NULL;
115 
116   // This is how you call a java static method from C++.
117   bool foo = base::android::Java_SampleForTests_staticJavaMethod(env);
118 
119   // This is how you call a java method from C++. Note that you must have
120   // obtained the jobject somehow.
121   ScopedJavaLocalRef<jobject> my_java_object;
122   int bar = base::android::Java_SampleForTests_javaMethod(
123       env, my_java_object, 1, 2);
124 
125   base::android::Java_SampleForTests_methodWithGenericParams(
126       env, my_java_object, nullptr, nullptr);
127 
128   // This is how you call a java constructor method from C++.
129   ScopedJavaLocalRef<jobject> my_created_object =
130       base::android::Java_SampleForTests_Constructor(env, 1, 2);
131 
132   std::cout << foo << bar;
133 
134   for (int i = 0; i < 10; ++i) {
135     // Creates a "struct" that will then be used by the java side.
136     ScopedJavaLocalRef<jobject> struct_a =
137         base::android::Java_InnerStructA_create(
138             env, 0, 1, ConvertUTF8ToJavaString(env, "test"));
139     base::android::Java_SampleForTests_addStructA(env, my_java_object,
140                                                   struct_a);
141   }
142   base::android::Java_SampleForTests_iterateAndDoSomething(env, my_java_object);
143   base::android::Java_SampleForTests_packagePrivateJavaMethod(env,
144                                                               my_java_object);
145   base::android::Java_SampleForTests_methodThatThrowsException(env,
146                                                                my_java_object);
147   base::android::Java_SampleForTests_javaMethodWithAnnotatedParam(
148       env, my_java_object, 42);
149 
150   base::android::Java_SampleForTests_getInnerInterface(env);
151   base::android::Java_SampleForTests_getInnerEnum(env);
152 
153   return 0;
154 }
155