Articles of jni

如何在Android库项目中调试本机代码?

我正在开发一个包含本机代码的Android库。 此库项目作为库添加到应用程序项目中。 我想在应用程序项目使用时调试库。 我很确定库(makefile,build命令,编译器选项)项目中的设置是可以的,因为我在库中尝试了调试器(我创建了一个虚拟Activity并取消设置“库”)并且它工作正常。 我也知道由于加载动态库所需的时间而可能发生的延迟,我认为这不是问题,原因相同。 在Application项目中,我只是添加了本机代码支持,将build命令设置为ndk_build NDK_DEBUG=1 , 但它永远不会在断点处停止 。 任何想法将不胜感激

Android NDK计时器

我在c中编写了一段代码来计算C代码的一部分所花费的时间,然后尝试将其报告回Java代码。 但问题是定时器差分总是回零。 这是原生C #include #include #include /* sleep() */ #include #include jstring Java_com_nsf_ndkfoo_NDKFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) { time_t start, end; start = time(NULL); if(start == (time_t)-1) { return 1; } sleep(5); end = time(NULL); char buf[60] = { 0 }; sprintf(buf,”according to difftime(), slept for %.8f seconds\n”, (int)difftime(end, start)); return (*env)->NewStringUTF(env, buf); } 当我运行这个时,我总是得到“根据difftime(),睡了-0.00000000秒”。 有什么想法有什么不对吗? […]

JNI,调用布尔方法

我得到了一个获取String并返回boolean的Java方法。 我从JNI这样称呼它: jmethodID function2ID = env->GetMethodID( activityClass, “MyFuncName”, “(Ljava/lang/String;)B”); if ( function2ID == null ) LOG(“Could not find MyFuncName Function”) jboolean IsAutoPlay = env->CallBooleanMethod( obj, function2ID, env->NewStringUTF(name)); 我得到致命信号11,不知道语法有什么问题吗?

Android如何阅读JNI核心转储文件

我正在编写JNI应用程序。 Logcat表示日志文件存在data / log / dumpstate_app_native.txt也是系统逻辑删除中的东西。 当我作为媒体设备访问Samsung Infuse时,我没有看到任何此类文件。 实际上我也没有看到我的应用程序数据文件? 它们在哪里,我确实看到了其他应用程序包,但在数据期间并不多。 这是我在logcat中看到的: dumpstate /data/log/dumpstate_app_native.txt将/ data / tombstones / tombstone_01复制到DropBox(SYSTEM_TOMBSTONE)将堆栈跟踪写入’/data/anr/traces.txt 我在设备上搜索* .txt的媒体设备,但没有find任何内容。

如何在Android Studio中添加.so,.mk和其他原生文件?

我要在Android Studio的Project中添加原生文件.so,.mk,.sh,.cpp 。 在eclipse中.so文件被添加到libs文件夹和jni和obj文件夹中的其他文件中,并且一切正常。 但是在Android工作室中我已经在jniLibs文件夹中添加了.so文件,并在.gradle文件中进行了如下更改 ndk{ abiFilters ‘armeabi’, ‘armeabi-v7a’, ‘x86’ } sourceSets.main { jniLibs.srcDir ‘src/main/libs’ //set libs as .so’s location instead of jniLibs jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk } 下面是我的项目结构和我需要添加的文件。 有jni和obj文件夹包含本机代码,我将使用它。 我已经看到可用的链接,但它们已经过时,没有任何效果。 任何帮助表示赞赏。 执行以下更改后记录: sourceSets.main { jniLibs.srcDir ‘src/main/libs’ //set libs as .so’s location instead of jniLibs jni.srcDirs = [] //disable […]

将C ++ longtypes转换为JNI jlong

我正在使用JNI在C ++和Java之间传递数据。 我需要传递一个’long’types,并且使用类似的东西: long myLongVal = 100; jlong val = (jlong)myLongVal; CallStaticVoidMethod(myClass, “(J)V”, (jvalue*)val); 但是在Java中,当检索到’long’参数时,它会被检索为一些非常大的负数。 我究竟做错了什么?

如何在Android上的C中加载我自己的Java类?

我试图调用我使用Android NDK从C编写的一些Java代码。 该应用程序是NativeActivity应用程序。 我必须访问一些仅在Java中可用的function,并且该function要求您子类化另一个类,所以我不能直接从C进行调用。因此,我有这样的Java代码: // src/com/example/my/package/SubClass.java package com.example.my.package; import android.foo.TheSuperClass; public class SubClass extends TheSuperClass { public SubClass() { setImportantProperty(true); } } 我也有这样的C代码: // Some file.c void setThatImportantJavaProperty() { JavaVM *vm = AndroidGetJavaVM(); // This returns a valid JavaVM object JNIEnv* env; (*vm)->AttachCurrentThread(vm, &env, 0); jclass theSubClass = (*env)->FindClass(env, “com/example/my/package/SubClass”); jthrowable exception = (*env)->ExceptionOccurred(env); if […]

Android LocalServerSocket

在android中,有两个类LocalServerSocket和LocalSocket。 我认为它们就像unix socket中的AF_LOCAL(我不确定它是否正确)。 我的问题是:是否可以在Java中创建LocalServerSocket并使用普通的unix套接字客户端在本机或其他进程中连接到它? 如果可能的话,我应该用本机设置什么“sockaddr_un.sun_path”? 我编写了一个示例项目来测试它,我尝试将.sun_path设置为与LocalServerSocket中使用的字符串名称相同,但是它失败了,本机无法连接到Java LocalServerSocket。 我的Java代码: package test.socket; import java.io.IOException; import java.io.InputStream; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.content.Intent; import android.net.LocalServerSocket; import android.net.LocalSocket; import android.os.Bundle; import android.util.Log; import android.view.View; public class TestSocketActivity extends Activity { public static String SOCKET_ADDRESS = “my.local.socket.address”; public String TAG = “Socket_Test”; static{System.loadLibrary(“testSocket”);} private native void clientSocketThreadNative(); private native void […]

Android JNI函数在主线程上运行?

我对从Android制作的JNI函数调用有疑问。 它们是否与Android应用程序在同一个线程上运行? 如果本机函数需要更多时间运行,UI是否会冻结?

Android.mk文件 – 包括不同文件夹和子文件夹中的所有源文件

在编写android .mk文件时,是否有一个简短的方法来包含许多源文件,这些文件位于不同的文件夹和子文件夹中? 像循环或用于迭代文件夹的代码? 例如: 文件夹1 | — subfolder1.1 |—subfolder1.1.1 |—some cpp files |–subfolder1.1.2 |–some cpp files 文件夹2 | — subfolder2.1 |–subfolder2.1.1 |–some cpp files | – (等等,另一个文件夹和子文件夹以及cpp文件) 我知道我可以使用include $(call all-subdir-makefiles)用于文件夹和子文件夹但是如果我有这么多文件夹会花费太多时间,有更好的方法吗? 像循环文件夹循环一样? 所以我只有一个用于folder1的库和另一个用于folder2的库等等……