mirror of
https://github.com/android/ndk-samples
synced 2025-11-04 06:15:39 +08:00
Compare commits
6 Commits
c9a3f453c6
...
5bb06e36e1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5bb06e36e1 | ||
|
|
62e815351e | ||
|
|
8f104f0c12 | ||
|
|
c8e408eed6 | ||
|
|
ab2d2e2ccd | ||
|
|
ace46d87b0 |
@@ -25,6 +25,7 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(":base")
|
||||
implementation libs.appcompat
|
||||
implementation project(":camera:camera-utils")
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ project(CameraBasic LANGUAGES C CXX)
|
||||
|
||||
include(AppLibrary)
|
||||
include(AndroidNdkModules)
|
||||
find_package(base REQUIRED CONFIG)
|
||||
find_package(camera-utils REQUIRED CONFIG)
|
||||
|
||||
android_ndk_import_module_native_app_glue()
|
||||
@@ -34,6 +35,7 @@ add_app_library(ndk_camera SHARED
|
||||
|
||||
target_link_libraries(ndk_camera
|
||||
PRIVATE
|
||||
base::base
|
||||
camera-utils::camera-utils
|
||||
android
|
||||
log
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <base/macros.h>
|
||||
#include <ndksamples/camera/native_debug.h>
|
||||
|
||||
#include "camera_engine.h"
|
||||
@@ -126,30 +127,46 @@ void CameraEngine::OnCameraPermission(jboolean granted) {
|
||||
* exposure and sensitivity SeekBars
|
||||
* takePhoto button
|
||||
*/
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_sample_camera_basic_CameraActivity_notifyCameraPermission(
|
||||
JNIEnv*, jclass, jboolean permission) {
|
||||
void notifyCameraPermission(JNIEnv*, jclass, jboolean permission) {
|
||||
std::thread permissionHandler(&CameraEngine::OnCameraPermission,
|
||||
GetAppEngine(), permission);
|
||||
permissionHandler.detach();
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_sample_camera_basic_CameraActivity_TakePhoto(JNIEnv*, jclass) {
|
||||
void TakePhoto(JNIEnv*, jclass) {
|
||||
std::thread takePhotoHandler(&CameraEngine::OnTakePhoto, GetAppEngine());
|
||||
takePhotoHandler.detach();
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_sample_camera_basic_CameraActivity_OnExposureChanged(
|
||||
JNIEnv*, jobject, jlong exposurePercent) {
|
||||
void OnExposureChanged(JNIEnv*, jobject, jlong exposurePercent) {
|
||||
GetAppEngine()->OnCameraParameterChanged(ACAMERA_SENSOR_EXPOSURE_TIME,
|
||||
exposurePercent);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_sample_camera_basic_CameraActivity_OnSensitivityChanged(
|
||||
JNIEnv*, jobject, jlong sensitivity) {
|
||||
void OnSensitivityChanged(JNIEnv*, jobject, jlong sensitivity) {
|
||||
GetAppEngine()->OnCameraParameterChanged(ACAMERA_SENSOR_SENSITIVITY,
|
||||
sensitivity);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* _Nonnull vm, void* _Nullable) {
|
||||
JNIEnv* env;
|
||||
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||
return JNI_ERR;
|
||||
}
|
||||
|
||||
jclass c = env->FindClass("com/sample/camera/basic/CameraActivity");
|
||||
if (c == nullptr) return JNI_ERR;
|
||||
|
||||
static const JNINativeMethod methods[] = {
|
||||
{"notifyCameraPermission", "(Z)V",
|
||||
reinterpret_cast<void*>(notifyCameraPermission)},
|
||||
{"TakePhoto", "()V", reinterpret_cast<void*>(TakePhoto)},
|
||||
{"OnExposureChanged", "(J)V", reinterpret_cast<void*>(OnExposureChanged)},
|
||||
{"OnSensitivityChanged", "(J)V",
|
||||
reinterpret_cast<void*>(OnSensitivityChanged)},
|
||||
};
|
||||
int rc = env->RegisterNatives(c, methods, arraysize(methods));
|
||||
if (rc != JNI_OK) return rc;
|
||||
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
|
||||
@@ -55,6 +55,10 @@ android {
|
||||
"x86_64",
|
||||
)
|
||||
}
|
||||
|
||||
// Allows buildTypes which inherit from debug to match dependencies
|
||||
// with the debug buildType.
|
||||
matchingFallbacks = ["debug"]
|
||||
}
|
||||
|
||||
release {
|
||||
@@ -136,6 +140,7 @@ android {
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
prefab true
|
||||
viewBinding true
|
||||
}
|
||||
|
||||
@@ -147,6 +152,7 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(":base")
|
||||
implementation libs.appcompat
|
||||
implementation libs.material
|
||||
implementation libs.androidx.constraintlayout
|
||||
|
||||
@@ -2,9 +2,10 @@ cmake_minimum_required(VERSION 3.22.1)
|
||||
project(sanitizers LANGUAGES CXX)
|
||||
|
||||
include(AppLibrary)
|
||||
find_package(base CONFIG REQUIRED)
|
||||
|
||||
add_app_library(sanitizers SHARED native-lib.cpp)
|
||||
target_link_libraries(sanitizers PRIVATE log)
|
||||
target_link_libraries(sanitizers PRIVATE base::base log)
|
||||
|
||||
if(SANITIZE)
|
||||
# For asan and ubsan, we need to copy some files from the NDK into our APK.
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
#include <base/macros.h>
|
||||
#include <jni.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
extern "C" JNIEXPORT jstring JNICALL
|
||||
Java_com_example_sanitizers_MainActivity_stringFromJNI(JNIEnv* env,
|
||||
jobject /* this */) {
|
||||
jstring StringFromJni(JNIEnv* env, jobject /* this */) {
|
||||
// Use-after-free error, caught by asan and hwasan.
|
||||
int* foo = new int;
|
||||
*foo = 3;
|
||||
@@ -18,3 +17,23 @@ Java_com_example_sanitizers_MainActivity_stringFromJNI(JNIEnv* env,
|
||||
std::string hello = "Hello from C++";
|
||||
return env->NewStringUTF(hello.c_str());
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,
|
||||
void* _Nullable) {
|
||||
JNIEnv* env;
|
||||
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||
return JNI_ERR;
|
||||
}
|
||||
|
||||
jclass c = env->FindClass("com/example/sanitizers/MainActivity");
|
||||
if (c == nullptr) return JNI_ERR;
|
||||
|
||||
static const JNINativeMethod methods[] = {
|
||||
{"stringFromJNI", "()Ljava/lang/String;",
|
||||
reinterpret_cast<void*>(StringFromJni)},
|
||||
};
|
||||
int rc = env->RegisterNatives(c, methods, arraysize(methods));
|
||||
if (rc != JNI_OK) return rc;
|
||||
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
|
||||
@@ -19,4 +19,12 @@ android {
|
||||
path 'src/main/cpp/CMakeLists.txt'
|
||||
}
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
prefab true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(":base")
|
||||
}
|
||||
|
||||
@@ -2,10 +2,13 @@ cmake_minimum_required(VERSION 3.22.1)
|
||||
project(SensorGraph LANGUAGES CXX)
|
||||
|
||||
include(AppLibrary)
|
||||
find_package(base CONFIG REQUIRED)
|
||||
|
||||
add_app_library(accelerometergraph SHARED sensorgraph.cpp)
|
||||
|
||||
target_link_libraries(accelerometergraph
|
||||
PRIVATE
|
||||
base::base
|
||||
android
|
||||
GLESv2
|
||||
log
|
||||
|
||||
@@ -41,6 +41,7 @@ const float SENSOR_FILTER_ALPHA = 0.1f;
|
||||
* Workaround AsensorManager_getInstance() deprecation false alarm
|
||||
* for Android-N and before, when compiling with NDK-r15
|
||||
*/
|
||||
#include <base/macros.h>
|
||||
#include <dlfcn.h>
|
||||
const char* kPackageName = "com.android.accelerometergraph";
|
||||
ASensorManager* AcquireASensorManagerInstance(void) {
|
||||
@@ -252,53 +253,48 @@ class sensorgraph {
|
||||
|
||||
sensorgraph gSensorGraph;
|
||||
|
||||
extern "C" {
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_android_accelerometergraph_AccelerometerGraphJNI_init(
|
||||
JNIEnv* env, jclass type, jobject assetManager) {
|
||||
(void)type;
|
||||
void Init(JNIEnv* env, jclass, jobject assetManager) {
|
||||
AAssetManager* nativeAssetManager = AAssetManager_fromJava(env, assetManager);
|
||||
gSensorGraph.init(nativeAssetManager);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_android_accelerometergraph_AccelerometerGraphJNI_surfaceCreated(
|
||||
JNIEnv* env, jclass type) {
|
||||
(void)env;
|
||||
(void)type;
|
||||
gSensorGraph.surfaceCreated();
|
||||
}
|
||||
void SurfaceCreated(JNIEnv*, jclass) { gSensorGraph.surfaceCreated(); }
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_android_accelerometergraph_AccelerometerGraphJNI_surfaceChanged(
|
||||
JNIEnv* env, jclass type, jint width, jint height) {
|
||||
(void)env;
|
||||
(void)type;
|
||||
void SurfaceChanged(JNIEnv*, jclass, jint width, jint height) {
|
||||
gSensorGraph.surfaceChanged(width, height);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_android_accelerometergraph_AccelerometerGraphJNI_drawFrame(
|
||||
JNIEnv* env, jclass type) {
|
||||
(void)env;
|
||||
(void)type;
|
||||
void DrawFrame(JNIEnv*, jclass) {
|
||||
gSensorGraph.update();
|
||||
gSensorGraph.render();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_android_accelerometergraph_AccelerometerGraphJNI_pause(JNIEnv* env,
|
||||
jclass type) {
|
||||
(void)env;
|
||||
(void)type;
|
||||
gSensorGraph.pause();
|
||||
}
|
||||
void Pause(JNIEnv*, jclass) { gSensorGraph.pause(); }
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_android_accelerometergraph_AccelerometerGraphJNI_resume(JNIEnv* env,
|
||||
jclass type) {
|
||||
(void)env;
|
||||
(void)type;
|
||||
gSensorGraph.resume();
|
||||
}
|
||||
void Resume(JNIEnv*, jclass) { gSensorGraph.resume(); }
|
||||
|
||||
extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,
|
||||
void* _Nullable) {
|
||||
JNIEnv* env;
|
||||
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||
return JNI_ERR;
|
||||
}
|
||||
|
||||
jclass c =
|
||||
env->FindClass("com/android/accelerometergraph/AccelerometerGraphJNI");
|
||||
if (c == nullptr) return JNI_ERR;
|
||||
|
||||
static const JNINativeMethod methods[] = {
|
||||
{"init", "(Landroid/content/res/AssetManager;)V",
|
||||
reinterpret_cast<void*>(Init)},
|
||||
{"surfaceCreated", "()V", reinterpret_cast<void*>(SurfaceCreated)},
|
||||
{"surfaceChanged", "(II)V", reinterpret_cast<void*>(SurfaceChanged)},
|
||||
{"drawFrame", "()V", reinterpret_cast<void*>(DrawFrame)},
|
||||
{"pause", "()V", reinterpret_cast<void*>(Pause)},
|
||||
{"resume", "()V", reinterpret_cast<void*>(Resume)},
|
||||
};
|
||||
int rc = env->RegisterNatives(c, methods, arraysize(methods));
|
||||
if (rc != JNI_OK) return rc;
|
||||
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
|
||||
@@ -19,9 +19,14 @@ android {
|
||||
path 'src/main/cpp/CMakeLists.txt'
|
||||
}
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
prefab true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(":base")
|
||||
implementation libs.appcompat
|
||||
implementation libs.androidx.constraintlayout
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ cmake_minimum_required(VERSION 3.22.1)
|
||||
project(ChoreographerNativeActivity LANGUAGES C CXX)
|
||||
|
||||
include(AppLibrary)
|
||||
find_package(base CONFIG REQUIRED)
|
||||
|
||||
# build the ndk-helper library
|
||||
get_filename_component(commonDir ${CMAKE_CURRENT_SOURCE_DIR}/../../../../common ABSOLUTE)
|
||||
@@ -40,6 +41,6 @@ set_target_properties(${PROJECT_NAME}
|
||||
# add lib dependencies
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
PRIVATE
|
||||
base::base
|
||||
NdkHelper
|
||||
)
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <EGL/egl.h>
|
||||
#include <android/log.h>
|
||||
#include <android_native_app_glue.h>
|
||||
#include <base/macros.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
#include <condition_variable>
|
||||
@@ -303,9 +304,7 @@ void Engine::SynchInCallback(jlong frameTimeInNanos) {
|
||||
}
|
||||
};
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_sample_choreographer_ChoreographerNativeActivity_choregrapherCallback(
|
||||
JNIEnv*, jobject, jlong frameTimeInNanos) {
|
||||
void ChoregrapherCallback(JNIEnv*, jobject, jlong frameTimeInNanos) {
|
||||
g_engine.SynchInCallback(frameTimeInNanos);
|
||||
}
|
||||
|
||||
@@ -611,4 +610,25 @@ void android_main(android_app* state) {
|
||||
}
|
||||
|
||||
g_engine.TermDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,
|
||||
void* _Nullable) {
|
||||
JNIEnv* env;
|
||||
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||
return JNI_ERR;
|
||||
}
|
||||
|
||||
jclass c =
|
||||
env->FindClass("com/sample/choreographer/ChoreographerNativeActivity");
|
||||
if (c == nullptr) return JNI_ERR;
|
||||
|
||||
static const JNINativeMethod methods[] = {
|
||||
{"choregrapherCallback", "(J)V",
|
||||
reinterpret_cast<void*>(ChoregrapherCallback)},
|
||||
};
|
||||
int rc = env->RegisterNatives(c, methods, arraysize(methods));
|
||||
if (rc != JNI_OK) return rc;
|
||||
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(":base")
|
||||
implementation libs.appcompat
|
||||
implementation libs.material
|
||||
implementation libs.androidx.constraintlayout
|
||||
|
||||
@@ -8,49 +8,25 @@ project("unittest")
|
||||
|
||||
include(AppLibrary)
|
||||
|
||||
find_package(base REQUIRED CONFIG)
|
||||
find_package(googletest REQUIRED CONFIG)
|
||||
find_package(junit-gtest REQUIRED CONFIG)
|
||||
|
||||
add_app_library(adder OBJECT adder.cpp)
|
||||
|
||||
# Creates and names a library, sets it as either STATIC
|
||||
# or SHARED, and provides the relative paths to its source code.
|
||||
# You can define multiple libraries, and CMake builds them for you.
|
||||
# Gradle automatically packages shared libraries with your APK.
|
||||
|
||||
add_app_library( # Sets the name of the library.
|
||||
add_app_library(
|
||||
unittest
|
||||
|
||||
# Sets the library as a shared library.
|
||||
SHARED
|
||||
|
||||
# Provides a relative path to your source file(s).
|
||||
$<TARGET_OBJECTS:adder>
|
||||
native-lib.cpp)
|
||||
|
||||
# Searches for a specified prebuilt library and stores the path as a
|
||||
# variable. Because CMake includes system libraries in the search path by
|
||||
# default, you only need to specify the name of the public NDK library
|
||||
# you want to add. CMake verifies that the library exists before
|
||||
# completing its build.
|
||||
|
||||
find_library( # Sets the name of the path variable.
|
||||
log-lib
|
||||
|
||||
# Specifies the name of the NDK library that
|
||||
# you want CMake to locate.
|
||||
log)
|
||||
|
||||
# Specifies libraries CMake should link to your target library. You
|
||||
# can link multiple libraries, such as libraries you define in this
|
||||
# build script, prebuilt third-party libraries, or system libraries.
|
||||
native-lib.cpp
|
||||
)
|
||||
|
||||
target_link_libraries( # Specifies the target library.
|
||||
unittest
|
||||
|
||||
# Links the target library to the log library
|
||||
# included in the NDK.
|
||||
${log-lib})
|
||||
PRIVATE
|
||||
base::base
|
||||
log
|
||||
)
|
||||
|
||||
add_app_library(app_tests SHARED adder_test.cpp)
|
||||
target_link_libraries(app_tests
|
||||
|
||||
@@ -1,8 +1,25 @@
|
||||
#include <base/macros.h>
|
||||
#include <jni.h>
|
||||
|
||||
#include "adder.h"
|
||||
|
||||
extern "C" JNIEXPORT jint JNICALL
|
||||
Java_com_example_unittest_MainActivity_add(JNIEnv*, jobject, jint a, jint b) {
|
||||
return add((int)a, (int)b);
|
||||
}
|
||||
jint Add(JNIEnv*, jobject, jint a, jint b) { return add((int)a, (int)b); }
|
||||
|
||||
extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,
|
||||
void* _Nullable) {
|
||||
JNIEnv* env;
|
||||
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||
return JNI_ERR;
|
||||
}
|
||||
|
||||
jclass c = env->FindClass("com/example/unittest/MainActivity");
|
||||
if (c == nullptr) return JNI_ERR;
|
||||
|
||||
static const JNINativeMethod methods[] = {
|
||||
{"add", "(II)I", reinterpret_cast<void*>(Add)},
|
||||
};
|
||||
int rc = env->RegisterNatives(c, methods, arraysize(methods));
|
||||
if (rc != JNI_OK) return rc;
|
||||
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user