mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-08-25 14:22:54 -06:00
Added Android builder juicy example
git-svn-id: svn://ultimatepp.org/upp/trunk@8640 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
20ee1a9a47
commit
99222001cf
15 changed files with 439 additions and 0 deletions
14
examples/AndroidMath/AndroidManifest.xml
Normal file
14
examples/AndroidMath/AndroidManifest.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.upp.AndroidMath">
|
||||
<application
|
||||
android:allowBackup="true">
|
||||
<activity android:name=".AndroidMathActivity"
|
||||
android:label="AndroidMath">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
23
examples/AndroidMath/AndroidMath.cpp
Normal file
23
examples/AndroidMath/AndroidMath.cpp
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#include <string.h>
|
||||
#include <jni.h>
|
||||
|
||||
#include <AndroidMathUtility/AndroidMathUtility.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Class: org_upp_AndroidMath_AndroidMath
|
||||
* Method: power
|
||||
* Signature: (II)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_upp_AndroidMath_AndroidMath_power
|
||||
(JNIEnv *, jclass, jint number, jint n)
|
||||
{
|
||||
return AndroidMathUtility::Power(number, n);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
15
examples/AndroidMath/AndroidMath.java
Normal file
15
examples/AndroidMath/AndroidMath.java
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
package org.upp.AndroidMath;
|
||||
|
||||
public class AndroidMath
|
||||
{
|
||||
private AndroidMath() {}
|
||||
|
||||
// Native stuff - C/C++
|
||||
public static native int power(int number, int n);
|
||||
|
||||
static {
|
||||
// In this place we are loading native libraries.
|
||||
// Native library always has upp package name!
|
||||
System.loadLibrary("AndroidMath");
|
||||
}
|
||||
}
|
||||
21
examples/AndroidMath/AndroidMath.upp
Normal file
21
examples/AndroidMath/AndroidMath.upp
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
description "Android builder juicy example\377";
|
||||
|
||||
uses
|
||||
AndroidMathUtility;
|
||||
|
||||
file
|
||||
MemoryManager readonly separator,
|
||||
MemoryManager.h,
|
||||
Native readonly separator,
|
||||
AndroidMath.cpp,
|
||||
Vector.cpp,
|
||||
Math readonly separator,
|
||||
Vector.java,
|
||||
Runtime readonly separator,
|
||||
AndroidManifest.xml,
|
||||
AndroidMath.java,
|
||||
AndroidMathActivity.java;
|
||||
|
||||
mainconfig
|
||||
"" = "";
|
||||
|
||||
48
examples/AndroidMath/AndroidMathActivity.java
Normal file
48
examples/AndroidMath/AndroidMathActivity.java
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
package org.upp.AndroidMath;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.widget.TextView;
|
||||
import android.widget.ScrollView;
|
||||
import android.os.Bundle;
|
||||
|
||||
public class AndroidMathActivity extends Activity
|
||||
{
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
ScrollView scroller = new ScrollView(this);
|
||||
TextView tv = new TextView(this);
|
||||
|
||||
calculatePowerOperations(tv, 20);
|
||||
calculateVectorOperations(tv);
|
||||
|
||||
scroller.addView(tv);
|
||||
setContentView(scroller);
|
||||
}
|
||||
|
||||
private void calculatePowerOperations(TextView tv, int maxPower)
|
||||
{
|
||||
String text = "Power:\n";
|
||||
int maxNumber = maxPower;
|
||||
for(int i = 1; i <= maxNumber; i++) {
|
||||
int pow = AndroidMath.power(i, 2);
|
||||
text += Integer.toString(i) + "^2 = " + Integer.toString(pow) + "\n";
|
||||
}
|
||||
|
||||
tv.append(text);
|
||||
}
|
||||
|
||||
private void calculateVectorOperations(TextView tv)
|
||||
{
|
||||
String text = "Vector operations:\n";
|
||||
|
||||
Vector vec1 = new Vector(3);
|
||||
|
||||
text += "Vec1 Size: " + Integer.toString(vec1.getSize()) + "\n";
|
||||
text += "Vec1: " + vec1.toString() + "\n";
|
||||
|
||||
tv.append(text);
|
||||
}
|
||||
}
|
||||
71
examples/AndroidMath/MemoryManager.h
Normal file
71
examples/AndroidMath/MemoryManager.h
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
#ifndef _JniMath_MemoryManager_h_
|
||||
#define _JniMath_MemoryManager_h_
|
||||
|
||||
#include <jni.h>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
/**
|
||||
* Java "HashCode()" object memory manager.
|
||||
*/
|
||||
template <class T>
|
||||
class MemoryManager {
|
||||
public:
|
||||
void Insert(JNIEnv *env, jobject jobj, const T& obj)
|
||||
{
|
||||
std::string hashCode = GetJobjectHasCode(env, jobj);
|
||||
if(!hashCode.empty()) {
|
||||
hashCodes.push_back(hashCode);
|
||||
values.push_back(obj);
|
||||
}
|
||||
}
|
||||
|
||||
void Erase(JNIEnv *env, jobject jobj)
|
||||
{
|
||||
int idx = FindIdx(env, jobj);
|
||||
if(idx >= 0) {
|
||||
hashCodes.erase(hashCodes.begin() + idx);
|
||||
values.erase(values.begin() + idx);
|
||||
}
|
||||
}
|
||||
|
||||
T* Get(JNIEnv *env, jobject jobj)
|
||||
{
|
||||
int idx = FindIdx(env, jobj);
|
||||
return idx != -1 ? &values[idx] : NULL;
|
||||
}
|
||||
|
||||
private:
|
||||
int FindIdx(JNIEnv *env, jobject jobj)
|
||||
{
|
||||
std::string hashCode = GetJobjectHasCode(env, jobj);
|
||||
for(int i = 0; i < hashCodes.size(); i++) {
|
||||
if(hashCode == hashCodes[i]) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string GetJobjectHasCode(JNIEnv *env, jobject jobj)
|
||||
{
|
||||
jclass cls = env->GetObjectClass(jobj);
|
||||
jmethodID mid = env->GetMethodID(cls, "hashCode", "()I");
|
||||
if(mid == 0) {
|
||||
return "";
|
||||
}
|
||||
int ret = env->CallIntMethod(jobj, mid);
|
||||
|
||||
std::stringstream ss;
|
||||
ss << ret;
|
||||
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<std::string> hashCodes;
|
||||
std::vector<T> values;
|
||||
};
|
||||
|
||||
#endif
|
||||
96
examples/AndroidMath/Vector.cpp
Normal file
96
examples/AndroidMath/Vector.cpp
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
#ifndef _Included_org_upp_AndroidMath_Vector
|
||||
#define _Included_org_upp_AndroidMath_Vector
|
||||
|
||||
#include <jni.h>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include <AndroidMathUtility/AndroidMathUtility.h>
|
||||
|
||||
#include "MemoryManager.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
using AndroidMathUtility::Vector;
|
||||
|
||||
MemoryManager<Vector> mm;
|
||||
|
||||
/*
|
||||
* Class: org_upp_AndroidMath_Vector
|
||||
* Method: construct
|
||||
* Signature: (I)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_upp_AndroidMath_Vector_construct
|
||||
(JNIEnv *env, jobject obj, jint size)
|
||||
{
|
||||
mm.Insert(env, obj, Vector(size));
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_upp_AndroidMath_Vector
|
||||
* Method: destruct
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_upp_AndroidMath_Vector_destroy
|
||||
(JNIEnv *env, jobject obj)
|
||||
{
|
||||
mm.Erase(env, obj);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_upp_AndroidMath_Vector
|
||||
* Method: getSize
|
||||
* Signature: ()I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_upp_AndroidMath_Vector_getSize
|
||||
(JNIEnv *env, jobject obj)
|
||||
{
|
||||
Vector* vec = mm.Get(env, obj);
|
||||
|
||||
return vec->GetSize();
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_upp_AndroidMath_Vector
|
||||
* Method: get
|
||||
* Signature: (I)F
|
||||
*/
|
||||
JNIEXPORT jfloat JNICALL Java_org_upp_AndroidMath_Vector_get
|
||||
(JNIEnv *, jobject, jint)
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_upp_AndroidMath_Vector
|
||||
* Method: set
|
||||
* Signature: (IF)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_upp_AndroidMath_Vector_set
|
||||
(JNIEnv *, jobject, jint, jfloat)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_upp_AndroidMath_Vector
|
||||
* Method: toStirng
|
||||
* Signature: ()Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_org_upp_AndroidMath_Vector_toString
|
||||
(JNIEnv *env, jobject obj)
|
||||
{
|
||||
Vector* vec = mm.Get(env, obj);
|
||||
|
||||
return env->NewStringUTF(vec->ToString().c_str());
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
33
examples/AndroidMath/Vector.java
Normal file
33
examples/AndroidMath/Vector.java
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
package org.upp.AndroidMath;
|
||||
|
||||
/**
|
||||
* Class witch whole implementaiton is native.
|
||||
*/
|
||||
public class Vector
|
||||
{
|
||||
public Vector(int size)
|
||||
{
|
||||
construct(size);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finalize()
|
||||
{
|
||||
destroy();
|
||||
}
|
||||
|
||||
// Native stuff - C/C++
|
||||
public native int getSize();
|
||||
public native float get(int id);
|
||||
|
||||
public native void set(int id, float data);
|
||||
|
||||
public native String toString();
|
||||
|
||||
private native void construct(int size);
|
||||
private native void destroy();
|
||||
|
||||
static {
|
||||
System.loadLibrary("AndroidMath");
|
||||
}
|
||||
}
|
||||
4
examples/AndroidMath/init
Normal file
4
examples/AndroidMath/init
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#ifndef _AndroidMath_icpp_init_stub
|
||||
#define _AndroidMath_icpp_init_stub
|
||||
#include "AndroidMathUtility/init"
|
||||
#endif
|
||||
13
examples/AndroidMathUtility/AndroidMathUtility.cpp
Normal file
13
examples/AndroidMathUtility/AndroidMathUtility.cpp
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#include "AndroidMathUtility.h"
|
||||
|
||||
namespace AndroidMathUtility {
|
||||
|
||||
int Power(int number, int n) {
|
||||
int result = number;
|
||||
for(int i = 0; i < n - 1; i++) {
|
||||
result *= number;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
13
examples/AndroidMathUtility/AndroidMathUtility.h
Normal file
13
examples/AndroidMathUtility/AndroidMathUtility.h
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#ifndef _AndroidMathUtility_AndroidMathUtiliy_h
|
||||
#define _AndroidMathUtility_AndroidMathUtiliy_h
|
||||
|
||||
#include "Vector.h"
|
||||
|
||||
namespace AndroidMathUtility {
|
||||
|
||||
int Power(int number, int n);
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
8
examples/AndroidMathUtility/AndroidMathUtility.upp
Normal file
8
examples/AndroidMathUtility/AndroidMathUtility.upp
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
description "Supportive package for AndroidMath\377";
|
||||
|
||||
file
|
||||
AndroidMathUtility.h,
|
||||
AndroidMathUtility.cpp,
|
||||
Vector.h,
|
||||
Vector.cpp;
|
||||
|
||||
51
examples/AndroidMathUtility/Vector.cpp
Normal file
51
examples/AndroidMathUtility/Vector.cpp
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
#include <sstream>
|
||||
|
||||
#include "AndroidMathUtility.h"
|
||||
|
||||
namespace AndroidMathUtility {
|
||||
|
||||
Vector::Vector()
|
||||
{
|
||||
this->size = 0;
|
||||
}
|
||||
|
||||
Vector::Vector(int size)
|
||||
{
|
||||
data = new float[size];
|
||||
for(int i = 0; i < size; i++) {
|
||||
data[i] = 0.0f;
|
||||
}
|
||||
this->size = size;
|
||||
}
|
||||
|
||||
Vector::Vector(const Vector& vec)
|
||||
{
|
||||
if(vec.GetSize() > 0) {
|
||||
size = vec.GetSize();
|
||||
data = new float[size];
|
||||
for(int i = 0; i < size; i++) {
|
||||
data[i] = vec.data[i];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Vector::~Vector()
|
||||
{
|
||||
delete[] data;
|
||||
}
|
||||
|
||||
std::string Vector::ToString() const
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << "[";
|
||||
for(int i = 0; i < size; i++) {
|
||||
ss << data[i];
|
||||
if(i + 1 < size)
|
||||
ss << ", ";
|
||||
}
|
||||
ss << "]";
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
}
|
||||
26
examples/AndroidMathUtility/Vector.h
Normal file
26
examples/AndroidMathUtility/Vector.h
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
#ifndef _AndroidMathUtility_Vector_h_
|
||||
#define _AndroidMathUtility_Vector_h_
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace AndroidMathUtility {
|
||||
|
||||
class Vector {
|
||||
public:
|
||||
Vector();
|
||||
Vector(int size);
|
||||
Vector(const Vector& vec);
|
||||
virtual ~Vector();
|
||||
|
||||
int GetSize() const { return this->size; }
|
||||
|
||||
std::string ToString() const;
|
||||
|
||||
private:
|
||||
float* data;
|
||||
int size;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
3
examples/AndroidMathUtility/init
Normal file
3
examples/AndroidMathUtility/init
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#ifndef _AndroidMathUtility_icpp_init_stub
|
||||
#define _AndroidMathUtility_icpp_init_stub
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue