Android 没有JNI_OnLoad,也没有本机函数的返回值? 我需要用C++代码从原生方法生成Linux命令。

Android 没有JNI_OnLoad,也没有本机函数的返回值? 我需要用C++代码从原生方法生成Linux命令。,android,linux,android-ndk,java-native-interface,native,Android,Linux,Android Ndk,Java Native Interface,Native,这是我的类Test.java 然后我通过以下命令创建header.h: $ javah -classpath ../bin/classes com.example.new1.Test 在此之后,将在此路径com.example.new1中创建header.h 然后我创建jni文件,复制.h文件,创建.cpp文件,并在其中包含.h #include <string> #include <iostream> #include <stdio.h> #include

这是我的类Test.java

然后我通过以下命令创建header.h:

$ javah -classpath ../bin/classes com.example.new1.Test
在此之后,将在此路径com.example.new1中创建header.h 然后我创建jni文件,复制.h文件,创建.cpp文件,并在其中包含.h

#include <string>
#include <iostream>
#include <stdio.h>
#include <jni.h>
 #include "com_example_new1_Test.h"

std::string exec(const char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
std::string result = "";
while(!feof(pipe)) {
    if(fgets(buffer, 128, pipe) != NULL)
    result += buffer;
}
pclose(pipe);
return result;
然后打电话给NDK

有什么问题?顺便问一下,我将iwconfig作为linux命令传递,这取决于命令是什么?我还需要AndroidManifest的许可吗


您是否考虑过使用更简单的JNI函数进行测试,例如返回Hello,world!?是的,试试这个,no-JNI_-Onload警告不是问题,你的lib似乎加载得很好。我应该试试什么?我不明白!似乎没有问题,只是一个警告。在本机模块中提供JNI_OnLoad函数是典型的,但并不总是必需的;这是为了允许初始化模块。由于您没有该方法,因此不会发生初始化,您会收到警告。作为补充说明,您应该调用ReleaseStringUTFChars,而不考虑iCopy。看见
#include <string>
#include <iostream>
#include <stdio.h>
#include <jni.h>
 #include "com_example_new1_Test.h"

std::string exec(const char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
std::string result = "";
while(!feof(pipe)) {
    if(fgets(buffer, 128, pipe) != NULL)
    result += buffer;
}
pclose(pipe);
return result;
  JNIEXPORT jstring JNICALL Java_com_example_new1_Test_exec(JNIEnv* env, jobject javaThis , jstring cmd) {
const char * res;

    //res = env->GetStringUTFChars(cmd ) ;

   // const char* utf_string;
    jboolean isCopy;
    res = env->GetStringUTFChars(cmd, &isCopy);
    /* ... use string ... */
    if (isCopy == JNI_TRUE) {
        (env)->ReleaseStringUTFChars(cmd, res);
    }

std::string result = exec(res);
return (env)->NewStringUTF((const char* )result.c_str());
  }
$ /cygdrive/c/android-ndk-r4/ndk-build
make: Warning: File `/cygdrive/c/android-ndk-r4/build/core/import-locals.mk' has      modification time 140582392 s in the future
Cygwin         : Generating dependency file converter script
Compile++ thumb  : NDK1 <= NDK1.cpp
   Prebuilt       : libgnustl_static.a <= <NDK>/sources/cxx-stl/gnu-   libstdc++/4.6/libs/armeabi/
 SharedLibrary  : libNDK1.so 
 Install        : libNDK1.so => libs/armeabi/libNDK1.so
 Compile++ thumb  : NDK1 <= NDK1.cpp
 Prebuilt       : libgnustl_static.a <= <NDK>/sources/cxx-stl/gnu-   libstdc++/4.6/libs/armeabi-v7a/
 SharedLibrary  : libNDK1.so
Install        : libNDK1.so => libs/armeabi-v7a/libNDK1.so
 make: warning:  Clock skew detected.  Your build may be incomplete.
03-03 22:59:55.343: E/SpannableStringBuilder(9257): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-03 22:59:55.343: E/SpannableStringBuilder(9257): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-03 23:00:08.527: E/Trace(9852): error opening trace file: No such file or directory (2)
03-03 23:00:08.717: D/libEGL(9852): loaded /system/lib/egl/libEGL_mali.so
03-03 23:00:08.727: D/libEGL(9852): loaded /system/lib/egl/libGLESv1_CM_mali.so
03-03 23:00:08.727: D/libEGL(9852): loaded /system/lib/egl/libGLESv2_mali.so
03-03 23:00:08.747: D/OpenGLRenderer(9852): Enabling debug mode 0
03-03 23:00:21.960: D/dalvikvm(9852): Trying to load lib /data/data/com.example.new1/lib/libNDK1.so 0x41a1d8f8
03-03 23:00:21.980: D/dalvikvm(9852): Added shared lib /data/data/com.example.new1/lib/libNDK1.so 0x41a1d8f8
03-03 23:00:21.980: D/dalvikvm(9852): No JNI_OnLoad found in /data/data/com.example.new1/lib/libNDK1.so 0x41a1d8f8, skipping init