Tag: Android的NDK

Android NDK使用不同的命名空间调用本机方法

我是JNI编程的新手我可以从不同的JNI命名空间定义中调用本机方法吗? 例如: package com.example.hellojni; public class HelloJni extends Activity { public native int MyMethod(); public native int OtherMethod(); // this works have the namespace package=jniexport interface static {System.loadLibrary(“hello-jni”);} @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int b = OtherMethod(); //works int a = MyMethod(); //ERROR java.lang.reflect.InvocationTargetException } } ================File.c================ JNIEXPORT int JNICALL Java_Cardioline_HelloJni_MyMethod(JNIEnv *env, jobject […]

Android NDK可以在Android共享库中包含一个Windows dll吗?

甚至可以在ndk-build命令中链接/包含一个dll文件,并生成一个可以从android java代码访问dll函数的共享库。 我一直在尝试这样做,我尝试使用SWIG创建一个java包装器代码到dll而我没有成功,然后我开始认为它甚至可能! 谢谢。

如何为Android ndk准备我的.cpp文件来构建它们?

我们目前有一些用c ++编写的图像处理软件,我们的IOS应用程序正在使用它。 我正在尝试将此图像处理代码集成到我使用Android NDK创建的android项目中。 我有我的android项目和sdk所有设置并准备好了。 我也有ndk设置并准备好了。 我正在完成这个教程 (这很棒),我对他为native.c定义代码的部分感到难过,因为它有一个像这样的函数名, void Java_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_helloLog(JNIEnv * env, jobject this, jstring logThis) 它几乎让我觉得我必须通过所有现有的c ++函数并改变代码以便NDK识别它。 所以这是我的问题, 我是否必须更改现有的c ++代码才能使其与ndk构建器一起使用? 如果是这样,我需要在代码中更改这项工作的内容是什么? 有没有办法让Android.mk文件构建一个完整的目录? 我有很多文件,我不想列出每一个文件,以便建立它们。

Java JNI – 将C中分配的资源与java对象相关联?

我想在C中分配一些内存并使其与java对象实例相关联,如下所示: void configure(JNIEnv *object, jobject obj, ….) { char *buf = new char[1024]; // associated with somehow } 然后在java对象被垃圾收集时释放内存 – 我可以通过从java对象的finalize()方法调用JNI函数来实现。 问题是,如何将C指针与java对象相关联? 在对象中保留一个长字段并将指针强制转换为长 ? 有没有更好的办法?

本机库发出启动进程命令

错误:任务’:app:transformNativeLibsWithStripDebugSymbolForDebug’的执行失败。 启动进程’命令’C:\ Users \ LENOVO \ AppData \ Local \ Android \ Sdk \ ndk-bundle \ toolchains \ mips64el-linux-android-4.9 \ prebuilt \ windows-x86_64 \ bin \ mips64el-linux-android -跳闸”

如何从jni端调用java方法?

我在jni方面做了一些c代码函数,所有工作都很好。 public native String getMessage() 函数是从jni端返回到java端的字符串,它工作正常,所有其他jni代码也可以正常工作。 但问题是如何在不使用return的情况下返回jni函数中的字符串,所以 public native void getMessagewithoutReturn() 应该能够返回字符串。 然后我,但getMessagewithoutReturn()函数永远不会使用pthread结束循环,如下所示,你可以看到:(它有效) pthread_t native_thread; pthread_create(&native_thread, NULL, native_thread_start_reading, env); 并且每个循环迭代时间我都必须能够返回字符串,所以我不能使用return,因为它会停止函数运行。 pthread_t native_thread; pthread_create(&native_thread, NULL, native_thread_start_reading, env);sted out that 我已经测试了那个posix线程,并且在android方面一切正常,因为它一直不是启动工作线程,但现在只是在每个迭代时间获取字符串的问题,而不使用函数返回。

Android Studio中的ndk.dir错误

我试图使用opencv库,所以我在Android Studio中导入了一个项目,当我尝试运行它时出现了这个错误: 错误:任务执行失败’:openCVSamplefacedetection:compileDebugNdk’。 NDK未配置。 从http://developer.android.com/tools/sdk/ndk/下载NDK。然后在local.properties中添加ndk.dir = path /到/ ndk。 (在Windows上,确保转义反斜杠,例如C:\ ndk而不是C:\ ndk) 所以我下载了ndk,并将此行添加到local.properties文件中,该文件变为: sdk.dir=C\:\\Users\\skoon\\AppData\\Local\\Android\\sdk ndk.dir=C\:\\Users\\skoon\\AppData\\Roaming\\IDM\\android-ndk-r10d 但我仍然有这个错误,我不明白: 错误:任务执行失败’:openCVSamplefacedetection:compileDebugNdk’。 com.android.ide.common.internal.LoggedErrorException:无法运行命令:C:\ Users \ skoon \ AppData \ Roaming \ IDM \ android-ndk-r10d \ ndk-build.cmd NDK_PROJECT_PATH = null APP_BUILD_SCRIPT = C:\ Users \ skoon \ Downloads \ Compressed \ OpenCV-2.4.10-android-sdk \ OpenCV-2.4.10-android-sdk \ samples \ face-detection \ openCVSamplefacedetection \ […]

Android JNI从Java类中获取Two Fields

在我发布任何代码或任何内容之前,让我解释一下我要完成的任务:我要做的是从资源文件夹获取加载着色器,并将PongDroidShader对象数组传递给C ++,以便它可以编译和加载他们。 在我的Java类中,我有一个函数,它遍历着色器文件夹中的每个着色器文件并解析它将它加载到String对象中,同时还通过其文件扩展名检查它是什么类型的着色器类型(.eg,一个顶点)会有.vert扩展名)。 完成后,我将其发送到我的本机compileShaders函数,该函数获取PongDroidShader对象的数组以及数组的大小。 之后,我解析并链接JNI代码中的着色器。 到目前为止,我无法让JNI识别Java代码并将其加载到变量中。 我到目前为止的内容如下: Java代码 public final class PongDroidShader { public String mShaderSrc; public ShaderType mType; } private class ShaderHandler { … private native void compileShaders(PongDroidShader[] shaders, int shaderCount); … JNI / C ++代码 JNIEXPORT void JNICALL Java_com_grepwise_pongdroid_PongDroid_00024ShaderHandler_compileShaders (JNIEnv * env, jobject obj, jobjectArray shaders, jint sizeOfShaders) { for( int i = […]

如何在不崩溃的情况下处理来自jni的AudioTrack调用?

我试图从jni回调写入AudioTrack,我得到一个信号7(SIGBUS),故障地址00000000。 我查看了针对odroid的Wolf3D示例,他们似乎使用android.os.Handler发布一个Runnable,它将在正确的线程上下文中进行更新。 我也试过AttachCurrentThread,但在这种情况下我也失败了。 它可以在从构造函数运行时播放声音,即使我将其包装在一个线程中,然后将其发布到处理程序中。 当我通过jni的回调做“相同”时,它失败了。 我认为我正在制定一些规则,但我无法弄清楚它们是什么。 到目前为止,我还没有在SO上找到答案。 所以我想知道是否有人知道应该怎么做。 编辑:回答如下。 以下代码用于说明问题。 Java的: package com.example.jniaudiotrack; import android.app.Activity; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioTrack; import android.os.Bundle; import android.os.Handler; import android.util.Log; public class JniAudioTrackActivity extends Activity { AudioTrack mAudioTrack; byte[] mArr; public static final Handler mHandler = new Handler(); /** Called when the activity is first created. */ @Override […]

将指针从C传递到Java变为NULL

我正在开发一款适用于x86的Android应用程序,它需要与C进行一些集成。我一直在使用swig / JNI来完成这项工作,而且大部分内容都在顺利运行。 但是,指针一直给我一些错误。 我的问题是我能够在模拟器(ARM)中成功引用变量地址,但在设备(x86)上,事情并不顺利。 使用此链接中的示例,我发现一旦此地址转移到Java,C中任何已分配变量的地址都将变为NULL。 例如… Swig生成的JNI: SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1intp(JNIEnv *jenv, jclass jcls) { jlong jresult = 0 ; int *result = 0 ; (void)jenv; (void)jcls; result = (int *)new_intp(); LOGI(“Result is %x”, result); *(int **)&jresult = result; LOGI(“JResult is %x”, jresult); return jresult; } 包含new_intp()的源文件: static int *new_intp() { return (int *) […]